1

我想计算对资源的访问,但 HTTP GET 不应该修改资源。计数器应与资源一起显示。类似的情况是存储最后一次访问。

实现视图计数器的REST方式是什么?

4

1 回答 1

4

更新计数器以响应 GET 实际上并不违反 HTTP 协议。您没有修改您正在获取的资源,或客户端可以控制的任何其他资源。
如果不允许服务器响应 GET 进行任何更新,那么日志文件将违反 HTTP 合同!

这是RFC2616中的相关部分:

9.1.1 安全方法

实施者应该意识到该软件代表了用户在互联网上的交互,并且应该小心让用户意识到他们可能采取的任何可能对他们自己或他人产生意想不到的意义的行动。

特别是,已经建立了约定,即 GET 和 HEAD 方法不应该具有采取除检索之外的操作的意义。这些方法应该被认为是“安全的”。这允许用户代理以特殊的方式表示其他方法,例如 POST、PUT 和 DELETE,以便用户意识到正在请求可能不安全的操作。

当然,不可能确保服务器不会因为执行 GET 请求而产生副作用;事实上,一些动态资源认为这是一个特性。这里的重要区别是用户没有请求副作用,因此不能对它们负责。

要注意的第一件重要的事情是它说“不应该”而不是“不得”。在某些情况下,副作用是有效的。

第二个关键行是最后一行,它强调了用户没有提出任何想要进行更改的请求这一事实,因此由服务器来确保不会发生任何与客户期望相矛盾的事情。这就是“统一界面约束”的本质。服务器应该做客户期望的事情。这与客户端发出的非常不同

GET /myresource?operation=delete

在这种情况下,客户认为他们正在进行检索。如果客户端应用程序遵守超媒体约束,那么 URL 的内容是完全不透明的,因此客户端可以理解的唯一信息是动词 GET。如果服务器确实执行了删除操作,那么这显然违反了统一接口约束。

更新内部计数器不违反统一接口约束。如果将计数器包含在要检索的表示中,那么您将遇到一系列全新的问题,但我假设情况并非如此。

于 2010-01-27T12:24:23.570 回答