gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:53:19 24 4
gpt4 key购买 nike

我想在我的 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 header 并返回如下表示:
  • 搜索自 if-modified-since 标题中请求的时间以来更新的所有学生
  • 如果有的话,用 200 OK 返回那些学生
  • 如果该查询没有返回学生,则返回 304 Not Modified

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

    The If-Modified-Since request-header field is used with a method to make it conditional: if the requested variant has not been modified since the time specified in this field, an entity will not be returned from the server; instead, a 304 (not modified) response will be returned without any message-body.



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

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

    这不是标题的正确使用。 If-Modified-Since header 是 HTTP 客户端(浏览器或代码)在请求资源时可以选择提供给服务器的 header 。如果提供,则表示“我想要资源 X,但前提是它自时间 T 以来已更改。”其目的是允许客户端缓存资源。

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

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

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

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

    关于rest - 基于 If-Modified-Since header 修改 REST API 表示是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26363269/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com