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

时间:2010-01-14 16:27:04

标签: rest

可以想象,另一个客户也在此期间修改了资源的其他方面。因此,尽管有带宽开销,最好还是在PUT响应中始终包含完整表示吗?

4 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:8)

Jldupont的评论指出了我正确的方向。我将使用ETag通过使用If-match标头as described here进行条件PUT来确定资源是否已被修改。

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

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

答案 2 :(得分:7)

我喜欢将GET和DELETE视为一对 - 他们只需要一个ID。

POST和PUT看起来也像一对。它们采用序列化对象并使其持久化。因此,我认为POST和PUT都应该返回生成的结果对象。

在某些情况下,您可能会在持久性过程中进行其他计算,而PUT可能会反映这些计算结果。从技术上讲,这可能是第三次正常形式违规,因为您有派生值。但通常情况下,Web服务的重点是作为POST和PUT的一部分进行一些增值计算。

答案 3 :(得分:3)

您可以考虑返回303 See Other响应,并将Location标头设置为更新资源的URI(Post/Redirect/Get)。通过这种方式,客户端可以接收资源的当前状态(如果它选择遵循Location标头),即使它已在过渡期间进行了编辑,并且在使用浏览器时也没有重新提交请求的危险。 / p>

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

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