是否使用 If-Modified-Since 标头将资源集合过滤为仅 REST API 中最近的资源集合被视为有效方法?

Posted

技术标签:

【中文标题】是否使用 If-Modified-Since 标头将资源集合过滤为仅 REST API 中最近的资源集合被视为有效方法?【英文标题】:Is using the If-Modified-Since header to filter a resource collection to only recent ones in a REST API considered a valid approach? 【发布时间】:2021-02-03 14:34:36 【问题描述】:

我正在设计一个 REST API,我需要根据客户端提供的时间戳(反过来,它将是由 API 在之前的响应中生成)。为此,我正在考虑使用 Last-Modified 和 If-Modified-Since 标头。

这里的早期问题(如Is it valid to modify a REST API representation based on a If-Modified-Since header?)似乎表明这是不赞成的,因为RFC2616 表明这些标头的目的与缓存有关。但是,从那时起,RFC2616 已被RFC7232 取代,其中指出

If-Modified-Since 通常用于两个不同的目的:1) 允许有效更新没有实体标签的缓存表示,以及 2) 将 Web 遍历的范围限制为最近访问过的资源改变了。

我的解释是,我允许检索自上次检索以来对集合的所有更改的用例包含在第二个目的中。

所以我有两个问题:

    这种解释是正确的,还是我在这里遗漏了一些微妙的东西? 即使我的解释是正确的,以这种方式使用这些标题是否是一种好习惯?换句话说:还有什么其他原因不使用这些标头,而是在响应中包含时间戳,并允许客户端在下一个请求的查询字符串中提供该时间戳?

【问题讨论】:

【参考方案1】:

这种解释是正确的,还是我在这里遗漏了一些微妙的东西?

我相信RFC 7234 与您的解释相矛盾。

如果不存在 If-None-Match 头字段,则包含 If-Modified-Since 头字段([RFC7232] 的第 3.3 节)的请求表明客户端想要验证自己存储的一个或多个响应按修改日期。如果以下情况之一为真,缓存接收者应该生成 304(未修改)响应(使用所选存储响应的元数据)......

这里的主要问题是通用缓存不会知道您的资源/您的服务器对标准标头的含义有不同的理解,因此客户端不会获得您想要的体验。

还有……

我正在设计一个 REST API,我需要根据客户端提供的时间戳(反过来,它将是由 API 在之前的响应中生成)。

我们已经为此建立了一个标准化的机制 - 它是 URI。如果您查看菲尔丁对resource 的定义,这可能会变得更清楚。

我是这样理解的:在 REST 的上下文中,“资源”是“文档”的概括(另请参见 Jim Webber, 2011)。从相同(或重叠)的信息中派生出许多不同的文档是完全合理的。

认为“分页” - 每个页面都是不同的文档,具有自己的唯一标识符,但所有页面都源自相同的公共来源,随着时间的推移,项目从一个页面移动到另一个页面。

【讨论】:

感谢您的洞察力,尤其是关于 RFC 7234。再次证明标准化是一个难题;)。 URI 确实是一个完全有效的替代方案;只是我倾向于使用符合目的的标题。但是你已经对他们是否在这种情况下产生了足够的怀疑,所以我将采用 URI 方式。

以上是关于是否使用 If-Modified-Since 标头将资源集合过滤为仅 REST API 中最近的资源集合被视为有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

System.Net.Http.HttpClient 添加 If-Modified-Since 标头

基于 If-Modified-Since 标头修改 REST API 表示是不是有效?

在“If-Modified-Since”HTTP 标头中使用客户端生成的时间

在请求中发送“if-modified-since”标头

了解 If-Modified-Since HTTP 标头

Vimeo API 未响应“If-Modified-Since”标头