0

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

1 回答 1

0

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

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

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

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

此外...

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

我们已经有一个标准化的机制——它是 URI。如果您查看菲尔丁对资源的定义,这可能会变得更清楚。

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

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

于 2020-10-20T19:49:03.597 回答