【问题标题】:RESTful design: using ETag and If-None-Match for fetching new items in a collection?RESTful 设计:使用 ETag 和 If-None-Match 获取集合中的新项目?
【发布时间】:2011-10-30 09:17:38
【问题描述】:

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

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

  1. 项目集合在 URI http://foobar.com/items 处公开
  2. 在该 URI 上发出初始 GET 请求的客户端将不包含 If-None-Match 标头。在这种情况下,服务器返回所有项目(或服务器自行决定的某个数量,例如最近的 N 个项目)。响应包含一个 Etag 标头,指示“tick stamp”,它表示服务器伪时钟的当前伪时间(例如,每次数据更改时都会增加一些计数器)。
  3. 客户端缓存返回的项目。
  4. 在后续的 GET 请求中,客户端在其 If-None-Match 标头中包含先前收到的 Etag 值。服务器检查它是否有比 If-None-Match 标头更新的项目,如果是,则仅返回较新的项目。否则,它会返回 304 状态(“未修改”)并且没有项目。

问题 - 我是否通过仅返回 #4 中较新的项目而不是整个集合(其中包括已缓存在客户端上的项目)来颠覆 GET 的语义含义?或者这似乎是一种合理的方法?您能提出更好的替代方法吗?

提前致谢。

【问题讨论】:

  • 作为后续,我遇到了 RFC 3229(增量编码),这似乎很合适。

标签: rest


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 2020-05-05
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多