10

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

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

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

我在想这是否可能是:

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

3 回答 3

16

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 状态码

于 2018-06-01T12:41:57.993 回答
3

404 Not Found返回POST请求是一个有问题的状态。这意味着您发送请求的资源不存在;来电者的 URL 错误。

最明显(和通用)的答案是:400 Bad Request

这只是表明您的请求有问题(错误在于调用者而不是服务器),然后在您的响应正文中表达出问题的具体细节。这通常是处理请求验证的方式。


理想的答案是通过向他们所属的公司发送请求来添加用户:

POST /company/34
Content-Type: application/json
{
    "username": "newuser",
    "age": 99
}

这意味着调用者必须找到一个有效的company资源来发送请求。如果company/34不存在,404 Not Found则响应是适当的;您尝试将用户添加到不存在的公司。

这确实意味着您的 API 必须使用资源语义进行结构化,并且用户必须完全属于一家公司。

于 2018-06-01T12:27:22.507 回答
1

在这里,这张图很不错,我用过很多次了。

我应该返回哪个代码?

我会选择 404。资源可能存在(不是格式错误),但它不存在(因此无法找到)。

于 2018-06-01T12:19:33.967 回答