我想在我的 API 中实现“获取更改的值”功能。例如,假设我有以下 REST API 调用:
GET /ws/school/7/student
这得到了学校#7 的所有学生。不幸的是,这可能很多。因此,我想修改 API 以仅返回自特定时间以来已修改的学生记录。(用例是一个夜间进程从另一个系统运行,将所有学生从我的系统拉到他们的系统。)
我看到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)的定义说:
If-Modified-Since request-header 字段与一种方法一起使用,使其有条件:如果请求的变体自此字段中指定的时间以来没有被修改,则不会从服务器返回实体;相反,将返回没有任何消息正文的 304(未修改)响应。
这对我来说似乎是错误的。我们不会返回 RFC 指示的表示或 304,而是一些混合。似乎客户端代码(或更糟糕的是,服务器和客户端之间的网络缓存)可能会误解含义并替换本地缓存值,而实际上它应该只是更新它。
所以,两个问题:
- 这是对标题的正确使用吗?
- 如果不是(我怀疑不是),最佳做法是什么?查询字符串参数?