【问题标题】:HTTP Response 412 - can you include content?HTTP 响应 412 - 你可以包含内容吗?
【发布时间】:2010-04-22 16:55:32
【问题描述】:

我正在构建一个 RESTful 数据存储并利用条件 GET 和 PUT。在条件 PUT 期间,客户端可以在资源上包含来自先前 GET 的 Etag,如果当前表示不匹配,服务器将返回 HTTP 状态代码 412(前提条件失败)。请注意,这是一个基于 Atom 的服务器/协议。

我的问题是,当我返回 412 状态时,我还可以包含资源的新表示还是用户必须发出新的 GET? HTTP 规范似乎没有说是或否,Atom 规范也没有(尽管他们的示例在响应中显示了一个空的实体主体)。不返回新的表示并让客户端专门获取它似乎很浪费。想法?

【问题讨论】:

    标签: rest http atom-feed http-status-code-412


    【解决方案1】:

    虽然有条件的 GET 和 PUT 被概括为“有条件的请求”,但它们在概念上是非常不同的。条件 GET 是一种性能优化,而条件 PUT 是一种并发控制机制。很难一起讨论。

    关于条件 GET 的问题:如果您发送 GET 并包含 If-None-Match 标头,则如果资源已更改,服务器将发送 200 Ok,如果没有(如果条件失败)则发送 304 Not Modified。 412 只能与条件 PUT 一起使用。

    更新:似乎我稍微误读了这个问题。关于在条件 PUT 失败时“刷新”本地副本的观点:很可能缓存已经具有最新版本,并且您的 refresh-GET 将从某个缓存中提供。让服务器返回带有 412 的当前实体实际上可能会给您带来更差的性能。

    【讨论】:

    • 是的,我没有遵循您最初的答案-但是您关于可能的中间缓存的观点非常好。老实说,到目前为止我见过的最好的答案。
    【解决方案2】:

    不,从技术上讲,您不应该这样做。错误代码通常用于指定出现问题。尽管没有什么可以阻止您返回内容(实际上,像 404 这样的一些错误会返回一个漂亮的页面,上面写着您没有找到您要查找的内容),但响应的重点不是返回其他内容,而是返回一些告诉你出了什么问题的东西。从技术上讲,您也不应该返回该数据,因为您传递了 If-None-Match: etag (我假设这就是您传递的内容?)

    另一方面,您真的需要优化掉一个额外的 http 调用吗?

    我对此想得越多,我就越相信这是一个坏主意 - 你是否要返回任何其他错误的内容? PUT 语义是 PUT。 GET 语义应该用于 GET。

    【讨论】:

    • 优化一个 HTTP 调用很容易意味着每天保存数百万个请求 - 所以是的,我会赞成这样做。 POST 语义是 POST - 但是在成功的 POST 上返回内容是完全有效的,所以我不同意你的论点。
    • 你不是在做一个 POST,你是在做一个 PUT。 POST 语义不同于两者,在帖子上返回内容是有效的,因为语义状态: POST 和 PUT 请求之间的根本区别在于请求目标的不同含义。 POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。这意味着 POST 可以灵活地返回与 URI 无关的内容。
    【解决方案3】:

    如果由于更新冲突后的额外请求而产生的额外请求数量足以让您产生性能问题,那么我建议您可能会遇到资源粒度问题。

    您真的期望每天有数百万次多个用户同时编辑同一个资源吗?也许您需要将增量更改存储到资源,而不是直接更新资源。如果这些资源真的有这么多争用,那么用户就不会一直在处理过时的数据。

    如果您的问题是您的资源包含上次修改日期和上次修改用户,并且您必须在每次 PUT 后执行 GET,那么我会更加确信需要扭曲规则。

    但是,我认为额外请求对性能的影响是值得的,因为它让客户端开发人员更清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2018-05-27
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多