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

基于If-Modified-Since头修改RESTAPI表示是否有效?,rest,if-modified-since,Rest,If Modified Since,我想在我的API中实现“更改值”功能。例如,假设我有以下REST API调用: GET /ws/school/7/student 这让学校里所有的学生都兴奋不已。不幸的是,这可能是很多。所以,我想修改API,只返回自某个时间以来修改过的学生记录。(用例是一个夜间进程从另一个系统运行,将所有学生从我的系统拉到他们的系统。) 我看到建议使用if-modified-since标题并返回如下表示: 在if modified-since标题中搜索自请求时间以来更新的所有学员 如果有的话,给那些学生一个

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

GET /ws/school/7/student
这让学校里所有的学生都兴奋不已。不幸的是,这可能是很多。所以,我想修改API,只返回自某个时间以来修改过的学生记录。(用例是一个夜间进程从另一个系统运行,将所有学生从我的系统拉到他们的系统。)

我看到建议使用if-modified-since标题并返回如下表示:

  • 在if modified-since标题中搜索自请求时间以来更新的所有学员
  • 如果有的话,给那些学生一个200 OK
  • 如果没有从该查询返回学生,则返回一个未修改的值
我理解他想做什么,但这似乎是错误的做法。If-Modified-Since头()的定义是:

If Modified Since request header字段与一种方法一起使用,使其具有条件:如果请求的变量自该字段中指定的时间以来未被修改,则不会从服务器返回实体;相反,将返回304(未修改)响应,而不返回任何消息体

我觉得这是不对的。我们不会返回RFC指示的表示或304,而是一些混合。客户端代码(或者更糟糕的是,服务器和客户端之间的web缓存)可能会误解其含义并替换本地缓存值,而实际上它应该只是更新它

因此,有两个问题:

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

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

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

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

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

服务器端我想您从系统开始就有一系列的更新,上面表单的请求将获取序列值大于
{seq}
的前N个更新。通过这种方式,如果客户远远落后,需要迎头赶上,结果将被分页。

感谢您的确认,bass man。这也正是我的想法。