RESTful设计:使用ETag和If-None-Match来获取集合中的新项目?

时间:2011-10-28 20:14:59

标签: rest

我正在设计RESTful Web服务,并尝试提出一种处理项目集合的缓存和同步的好方法。我已经读过使用Etag和If-None-Match标头来优化各个资源的缓存,我想知道它们是否(或应该)用于集合。

我对您对以下方法的反馈感兴趣:

  1. 项目集合在URI http://foobar.com/items
  2. 中公开
  3. 在该URI上发出初始GET请求的客户端将不包含If-None-Match标头。在这种情况下,服务器返回所有项目(或服务器自行决定的一些金额,比如最近的N项)。该响应包含一个Etag标题,表示一个“刻度标记”,表示服务器伪时钟的当前伪时间(例如,每当数据发生变化时,某个计数器就会增加)。
  4. 客户端缓存返回的项目。
  5. 在后续的GET请求中,客户端在其If-None-Match标头中包含先前收到的Etag值。服务器检查它是否有比If-None-Match标头更新的项目,如果是,则仅返回较新的项目。否则,它返回304状态(“未修改”)并且没有项目。
  6. 问题 - 我是否仅通过返回#4中的较新项而不是整个集合(包括已缓存在客户端上的项目)来颠覆GET的语义?或者这似乎是一种合理的方法?你能建议更好的替代方法吗?

    提前致谢。

1 个答案:

答案 0 :(得分:2)

通常,客户端在HEAD请求之后进行ETAG比较,并在必要时跟进更具体的请求(范围请求或查询比某个时间戳更新的条目)。服务器应该只是提供所请求的资源。

这个想法是,中间缓存代理可以插入到通信链中,而客户端或服务器不必更改其代码。