可以想象,另一个客户也在此期间修改了资源的其他方面。因此,尽管有带宽开销,最好还是在PUT响应中始终包含完整表示吗?
答案 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 OK
,202 Accepted
等)。此外,根据您对REST的定义,您可能会认为这是非标准做法。
如果客户可能是由人操作的浏览器,则可能更合适。