代码之家  ›  专栏  ›  技术社区  ›  Kevin Pauli

在REST中,我是否应该返回表示以响应PUT?

  •  22
  • Kevin Pauli  · 技术社区  · 16 年前

    可以想象,在此期间,另一个客户端也修改了资源的其他方面。那么,尽管存在带宽开销,但在对PUT的响应中始终包含完整表示是最佳做法吗?

    4 回复  |  直到 16 年前
        1
  •  19
  •   Stefan Tilkov    16 年前

    在许多(如果不是大多数)情况下,服务器将向资源添加某些内容,即使它是通过PUT创建或更新的。例如时间戳、版本号或从其他元素计算的任何元素。即使您遵循RESTful方法并且不使用PUT进行部分更新,这也是正确的。

    仅出于这个原因,对于PUT请求,返回更新或创建的资源的表示形式通常是一个好主意。我不一定把它称为“最佳实践”,不过如果你放了一个巨大的2GB图像文件,你可能不想把它作为响应的一部分返回。

    另一方面,包括ETag,绝对值得“最佳实践”地位。

        2
  •  8
  •   Kevin Pauli    16 年前

    杜邦的评论为我指明了正确的方向。我将使用etag通过使用If-match头执行条件PUT来确定资源是否已被修改, as described here

    然后,在发生冲突的情况下,我将让用户决定是从服务器获取最新的表示(GET),还是用自己的表示覆盖更改。

    因此,不需要在对PUT的响应中返回完整的表示,而只是为了帮助检测和解决冲突。

        3
  •  7
  •   Russ Amos S.Lott    14 年前

    POST和PUT看起来也是一对。它们获取序列化对象并使其持久化。因此,我认为POST和PUT都应该返回创建的结果对象。

    在某些情况下,作为持久性的一部分,您可能正在进行额外的计算,PUT可能会反映这些计算结果。从技术上讲,这可能是第三个正常形式冲突,因为您有派生值。但通常,web服务的全部目的是在POST和PUT中进行一些增值计算。

        4
  •  3
  •   Ian Mackinnon    15 年前

    您可能希望考虑退货。 303 See Other Location 标题设置为已更新资源的URI( Post/Redirect/Get ). 通过这种方式,客户端接收资源的当前状态(如果它选择遵循 标题),即使它已在过渡期间进行了编辑,并且如果使用浏览器,不会有重新提交请求的危险。

    但是,此模式阻止发送适当的成功代码( 200 OK , 202 Accepted

    如果客户机可能是由人操作的浏览器,那么这可能更合适。