你如何处理资源的变化?

时间:2013-08-20 14:17:27

标签: http rest caching

我有一个问题,如果有人能给出一个伪示例如何处理,我将不胜感激。

假设我的应用程序有可以执行GET的URL

/clients/{clientId}/contactsSummary
/locations/{locationId}/contactsSummary

我想兑现。现在,如果我在

上进行POST / PATCH / DELETE
/contacts/{contactId} 

如何使缓存失效。显然,更改,创建或删除联系人会导致前两个URL返回缓存版本,这将是不正确的。处理这个问题的机制是什么?

2 个答案:

答案 0 :(得分:0)

如果前端绝对需要最新信息,请不要缓存。否则,为每个缓存项添加一个到期时间,从检索它们的那一刻起,可以是1秒到1小时(或更长)。

但是,您可能需要处理一致性问题。例如,您可能对过期的联系人有一个未过期的引用。

假设cache是从URL到元组(expires,data)的字典。检索URL的伪代码是:

cacheItem= cache[ULR]
if( cacheItem == null || cacheItem.expires < currentTime )
    cacheItem= ( currentTime + 1_hour , http_get(URL) )
    cache[ULR]= cacheItem
return cacheItem.data

答案 1 :(得分:0)

客户端决定是否要检索资源的当前表示。使用所谓的“条件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是修改后的版本。

PUT /path/to/resource
If-Match: foo

<强>取值

客户端具有当前版本,因此资源上的PUT正常。

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