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

2023-12-19

我想在我的 API 中实现“获取更改值”功能。例如,假设我有以下 REST API 调用:

GET /ws/school/7/student

这得到了#7 学校的所有学生。不幸的是,这可能很多。因此,我想修改 API 以仅返回自特定时间以来已修改的学生记录。 (用例是每晚从另一个系统运行一个进程,将所有学生从我的系统拉到他们的系统。)

I see http://blog.mugunthkumar.com/articles/restful-api-server-doing-it-the-right-way-part-2/ http://blog.mugunthkumar.com/articles/restful-api-server-doing-it-the-right-way-part-2/建议使用 if-modified-since 标头并返回如下表示:

  • 搜索自 if-modified-since 标题中请求的时间以来更新的所有学生
  • 如果有的话,返回那些学生并给出 200 OK
  • 如果该查询没有返回任何学生,则返回 304 Not Modified

我明白他想做什么,但这似乎是错误的做法。 If-Modified-Since 标头的定义 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24) says:

If-Modified-Since 请求头字段与方法一起使用以使其成为条件:如果自该字段中指定的时间以来请求的变体尚未被修改,则不会从服务器返回实体;相反,将返回 304(未修改)响应,不带任何消息正文。

这对我来说似乎是错误的。我们不会返回 RFC 指示的表示形式或 304,而是返回某种混合形式。看起来客户端代码(或者更糟糕的是,服务器和客户端之间的网络缓存)可能会误解含义并替换本地缓存的值,而实际上它应该只是更新它。

那么,两个问题:

  • 这是标题的正确使用吗?
  • 如果不是(我怀疑不是),最佳实践是什么?查询字符串参数?

这不是标头的正确使用方式。这If-Modified-Since标头是 HTTP 客户端(浏览器或代码)可以使用的标头可选地请求资源时向服务器提供。如果提供的话,含义是“我想要资源 X,但前提是它自时间 T 以来发生了更改。”其目的是允许客户端缓存资源。

您建议的用法的语义是“我想要更新自时间 T 以来发生的集合 X”。这是对 X 子集的请求。您的动机似乎不是启用缓存。您的客户端缓存表示似乎包含所有 X,即使典型的请求只会返回对 X 的一小部分更改;也就是说,响应是not您直接缓存的内容,因此缓存需要在自定义用户逻辑客户端中进行。

查询字符串参数是一个更合适的解决方案。以下{seq}类似于序列号或时间戳。

GET /ws/schools/7/students/updates?since={seq}

服务器端我想自系统启动以来您有一系列更新,并且上述形式的请求将获取序列值大于的前 N ​​个更新{seq}。通过这种方式,如果客户远远落后并需要赶上,结果就会被分页。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 If-Modified-Since 标头修改 REST API 表示是否有效? 的相关文章

随机推荐