【问题标题】:In REST, should I return the representation in response to a PUT?在 REST 中,我应该返回表示以响应 PUT 吗?
【发布时间】:2012-08-19 09:40:22
【问题描述】:

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

【问题讨论】:

  • 返回与交易关联的唯一标识符会更好吗?节省带宽并避免可能不得不返回服务器以确保在此期间没有发生任何事情。 IE。如果你返回数据,它可能无论如何都是陈旧的。
  • 这太不可思议了... 20 分钟前我也在问自己同样的问题...

标签: rest


【解决方案1】:

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

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

另一方面,包含 ETag 绝对值得“最佳实践”状态。

【讨论】:

  • 我喜欢这个答案,因为它提到了返回资源是如何提供帮助的,但仍然坚持这样一个事实,即这也不是一个好主意。值得注意的一件事是,遗憾的是这样的响应不会被缓存,因为目前没有机制可以使 PUT 缓存响应中的表示。 Rfc7231 describes one for the request,但它仅在服务器没有向资源添加任何内容时才有效(请参阅this comment)。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我喜欢认为 GET 和 DELETE 是一对——它们只需要一个 ID。

    POST 和 PUT 似乎也是一对。他们采用序列化对象并使其持久化。因此,我认为 POST 和 PUT 都应该返回创建的结果对象。

    在某些情况下,您可能会在持久性中进行额外的计算,而 PUT 可以反映这些计算结果。从技术上讲,这可能是第 3 种范式违规,因为您有派生值。但通常,Web 服务的全部意义在于进行一些增值计算,作为 POST 和可能的 PUT 的一部分。

    【讨论】:

    • 我很欣赏你的哲学,但不同意(至少部分)。 HTTP 规范并不(就像它对 GET 一样)要求/禁止/限制 DELETE 仅是一个 URL。更重要的是,不是唯一认为这种情况的人(更重要的是,像 Talend 这样的主要软件项目都是围绕这个假设设计的。)针对单个实体的 DELETE 请求不需要正文(如 GET),但如果没有一些数据来优化请求,则对集合的 DELETE 请求非常激烈
    【解决方案4】:

    您可能希望考虑返回 303 See Other 响应,并将 Location 标头设置为更新资源的 URI (Post/Redirect/Get)。这样,客户端即使在过渡期间已被编辑过,也能接收到资源的当前状态(如果它选择跟随 Location 标头),并且如果使用浏览器,则不会有重新提交请求的危险。

    但是,此模式无法发送可能对客户端有用的适当成功代码(200 OK、202 Accepted 等)。此外,根据您对 REST 的定义,您可能会认为这是非标准做法。

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

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2014-08-06
      相关资源
      最近更新 更多