首页 > 解决方案 > POST 时数据不正确时的 HTTP 状态(使用不存在的资源 ID)

问题描述

当我执行 POST 请求以创建新用户时返回的正确 HTTP 状态是什么,但其中一个参数不正确 - 我包含在用户数据中的公司 ID 在数据库中不存在。

POST 数据:{用户名:'newuser',年龄:99,company_id:34 }

数据库中不存在 ID 为 34 的公司。

我在想这是否可能是:

标签: resthttp-status-codeshttp-status-code-422

解决方案


400或者422

首先,请记住这是一个客户端错误,因此5xx状态代码不适合这里。你应该选择一个4xx状态码。

最明显的选项是400422

  • 如果 JSON 在语法上无效,则返回400
  • 如果 JSON 在语法上有效但其内容无效,则返回422表示请求实体无法被服务器处理。

请参阅RFC 4918中的以下引用(对于您的情况,只需阅读JSON当它说XML):

11.2. 422 无法处理的实体

( 422Unprocessable Entity) 状态码意味着服务器理解请求实体的内容类型(因此 415(Unsupported Media Type) 状态码是不合适的),并且请求实体的语法是正确的(因此是400(Bad Request) 状态码不合适)但无法处理包含的说明。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会出现这种错误情况。

在这个答案中解决了类似的情况。


例如,如果负载的内容包含无效值(但在语法上有效) , GitHub API v3也会返回:422

接收请求正文的 API 调用存在三种可能的客户端错误类型:

  1. 发送无效的 JSON 将导致400 Bad Request响应。[...]

  2. 发送错误类型的 JSON 值将导致400 Bad Request response. [...]

  3. 发送无效字段将导致422 Unprocessable Entity响应。[...]


Michael Kropat整理了一组图表,在选择最合适的状态代码时非常有见地。4xx状态码见下图:

选择正确的 4xx 状态码


推荐阅读