什么 HTTP 响应代码用于失败的 POST 请求?

mko*_*mko 11 api-design http http-status-codes

当 POST 请求不成功并且请求正文格式正确时,应该返回什么 HTTP 响应代码?

对于成功的 POST 请求,我使用 201 - Created,但没有等效的未创建代码。

我在想 400 - 错误的请求,但这实际上会向用户指出请求格式错误或 304 - 未修改。

cas*_*lin 10

POST请求不成功并且请求正文格式正确时,应该返回什么 HTTP 响应代码?

如果您的意思是请求有效负载的语法有效但由于数据无效而无法处理,您可以使用422

11.2. 422 无法处理的实体

422(处理的实体)状态代码表示的服务器理解的内容类型的请求实体的(因此一个 415(不支持的媒体类型)状态代码是不适当的),并且请求实体的语法是正确的(因而400(错误请求)状态代码不合适)但无法处理包含的说明。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会出现这种错误情况。

请记住在响应负载中提供一个很好的描述,解释负载有什么问题。有关如何报告 HTTP API 中的问题的详细信息,请参阅RFC 7807


更新(根据评论)

POST请求失败的原因更多是业务逻辑错误,例如“账户余额太低,无法提取 5.00 美元”

对于您评论中描述的情况,403或者409会更合适。

6.5.3. 403 禁地

403(禁止)状态代码表示该服务器理解请求,但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应负载(如果有)中描述该原因。[...]

6.5.8. 409 冲突

409(冲突)状态代码表示请求无法完成,由于与目标资源的当前状态的冲突。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个负载,其中包含足够的信息让用户识别冲突的来源。[...]