PUT方法的HTTP状态码

21

一个PUT 请求可能有多种结果,我想知道哪个状态码最适合表示它们。

比如说我想要创建一个新的资源,那么我会像这样做:

PUT http://example.com/resources/resource-1

当我创建了一个新的资源后,我会得到一个HTTP 201响应。

现在我想要更新这个资源,所以我发送同样的请求,只是更新了内容:

PUT http://example.com/resources/resource-1

如果资源已经更新,我会得到HTTP 200HTTP 204代码。但是如果我再次发送相同内容的请求呢?即使没有更新,服务器是否应该返回HTTP 200HTTP 204

我知道HTTP 200HTTP 204都表示成功处理了请求,即使数据没有改变,请求仍然可以(并且应该)被成功处理。但是是否有一种方法可以告诉客户端请求已经成功处理但服务器端没有任何更改?如果有的话,是否应该用于PUT请求?由于PUT是幂等的,因此是否应根据服务器端的实际处理返回不同的状态(只要在此处理过程中没有出现错误)?

1个回答

20
但有没有一种方法可以告诉客户端请求已经成功处理,但服务器端没有发生任何变化呢?
是有的,但这不是状态码的作用。
可以返回200 OK和实体的表示形式,或者返回204 No Content并且什么都不返回。
对于未应用任何更改,请使用类似ETag的标头。客户端可以将ETag与其先前值进行比较,并确定未更改任何内容。

如果资源在第一次PUT请求返回201,但在后续请求返回200或204,那么这不会违反幂等性(PUT所需)。 - Ray
5
不行,因为幂等性是关于服务器上的结果,更具体地说是关于由请求URL标识的资源的字节内容,而不是响应消息的内容。同一个资源进行多次PUT操作,服务器上的结果不会改变。 :) 例如,请参见:“请注意,虽然幂等操作在服务器上产生相同的结果(没有副作用),但响应本身可能不同(例如,资源的状态可能在请求之间发生变化)” - CodeCaster
啊...谢谢你的澄清——现在完全明白了。 - Ray
以下是翻译的文本内容:对于完成:这篇文章中的答案 HTTP状态码用于更新和删除? 非常有帮助。 - thinwybk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接