客户端决定是否要检索资源的当前表示。使用所谓的“条件 GET”。
如果请求消息包含 If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match 或 If-Range 头字段,则 GET 方法的语义更改为“条件 GET”。条件 GET 方法请求仅在条件头字段描述的情况下传输实体。条件 GET 方法旨在通过允许刷新缓存的实体而不需要多个请求或传输客户端已经持有的数据来减少不必要的网络使用。
(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html的第 9.3 节)
这是如何运作的?C是客户端,S是服务器。
C
GET /path/to/resource
小号
200 OK
ETag: foo
Last-Modified: Tue, 15 Nov 1994 12:45:00 GMT
C
客户端PUT
sa 修改版本。
PUT /path/to/resource
If-Match: foo
小号
客户端具有当前版本,因此PUT
资源上的 a 是可以的。
200 OK
ETag: bar
Last-Modified: Tue, 15 Nov 1994 12:46:00 GMT
C
客户端PUT
修改了版本,但与此同时资源已更改并且ETag: bar
不再匹配。
PUT /path/to/resource
If-Match: bar
小号
412 Precondition Failed
C
客户端GET
是资源的当前版本。
GET /PATH/to/resource
小号
200 OK
ETag: baz
Last-Modified: Tue, 15 Nov 1994 12:47:00 GMT
C
现在客户端可以PUT
再次获取资源。
PUT /path/to/resource
If-Match: ba7
小号
200 OK
ETag: qux
Last-Modified: Tue, 15 Nov 1994 12:48:00 GMT