【发布时间】:2014-12-09 09:24:40
【问题描述】:
我想在我的 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,而是一些混合。看起来客户端代码(或者更糟糕的是,服务器和客户端之间的网络缓存)可能会误解含义并替换本地缓存值,而实际上它应该只是更新它。
那么,两个问题:
- 这是对标头的正确使用吗?
- 如果不是(我怀疑不是),最佳做法是什么?查询字符串参数?
【问题讨论】: