资源已存在时用于POST的HTTP响应代码

我正在构建一个允许客户端存储对象的服务器。 这些对象在客户端完全构造,并且对象ID在整个生命周期内都是永久的。

我定义了API,以便客户可以使用PUT创建或修改对象:

PUT /objects/{id} HTTP/1.1
...

{json representation of the object}

{id}是对象ID,因此它是Request-URI的一部分。

现在,我还考虑允许客户使用POST创建对象:

POST /objects/ HTTP/1.1
...

{json representation of the object, including ID}

由于POST意味着“追加”操作,因此我不确定在对象已经存在的情况下该怎么办。 我应该将请求视为修改请求还是应该返回一些错误代码(哪个)?


我的感觉是409 Conflict是最合适的,然而,在野外很少看到409 Conflict

由于与资源当前状态的冲突,请求无法完成。 只有在预期用户可能能够解决冲突并重新提交请求的情况下,才允许使用此代码。 响应主体应该包含足够的信息以供用户识别冲突的来源。 理想情况下,响应实体会为用户或用户代理提供足够的信息来解决问题; 然而,这可能是不可能的,也不是必需的。

冲突最有可能发生以响应PUT请求。 例如,如果正在使用版本控制并且包含PUT的实体更改为与先前(第三方)请求发生冲突的资源发生冲突,则服务器可能会使用409响应来指示它无法完成请求。 在这种情况下,响应实体可能会以响应Content-Type定义的格式包含两个版本之间的差异列表。


我个人使用WebDAV扩展422 Unprocessable Entity

REST模式将其描述为

422 Unprocessable Entity状态码意味着服务器理解请求实体的内容类型(因此415 Unsupported Media Type状态码不合适),并且请求实体的语法是正确的(因此400 Bad Request状态码不合适)但无法处理包含的说明。


根据RFC 7231,a 303可以使用如果处理POST的结果等同于现有资源的表示。

链接地址: http://www.djcxy.com/p/1081.html

上一篇: HTTP response code for POST when resource already exists

下一篇: If REST applications are supposed to be stateless, how do you manage sessions?