POST 数据不正确时的 HTTP 状态(使用不存在的资源 ID)

Tal*_*ita 7 rest http-status-codes http-status-code-422

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

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

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

我在想这是否可能是:

  • 400,一种无效的数据,但它是有效但不存在的id
  • 404 - 但不清楚哪个资源不存在
  • 409,因为这是一种冲突,用户可以通过更改公司 ID 来解决这个问题
  • 422?
  • 或 500 - 因为这是一种数据库错误,而不允许存在不存在的 id

cas*_*lin 11

400 或者 422

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

最明显的选项是400422

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

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

11.2. 422 无法处理的实体

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

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


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

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

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

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

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


迈克尔Kropat放在一起组图那是相当有见地,当谈到挑选最合适的状态码。4xx状态代码见下图:

选择正确的 4xx 状态代码

  • 我通常建议人们避免使用与 WebDAV 相关的状态代码,除非他们积极使用 WebDAV 标准作为其 API 的基础;我认为消费者从晦涩的标准中挑选一个特定的(尽管合适的)状态代码而忽略关于该标准的所有其他内容是令人困惑的。https://en.wikipedia.org/wiki/Principle_of_least_astonishment (3认同)