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

时间:2018-06-01 12:14:51

标签: rest http-status-codes http-status-code-422

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

POST 数据:{username:' newuser',年龄:99, company_id:34 }

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

我在想是否可以:

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

3 个答案:

答案 0 :(得分:2)

对于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必须使用资源语义进行结构化,并且用户必须属于一家公司。

答案 1 :(得分:2)

400422

首先,请保持最小值为client error,因此5xx状态代码不适用于此处。您应该选择4xx状态代码。

最明显的选项是400422

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

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

  

11.2. 422 Unprocessable Entity

     

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

answer已解决了类似情况。

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

  

API调用有三种可能的客户端错误类型   收到请求机构:

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

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

  4.   
  5. 发送无效字段会导致422 Unprocessable Entity响应。 [...]

  6.   

Michael Kropat汇总了set of diagrams,在选择最合适的状态代码方面非常有见地。有关4xx状态代码,请参阅下图:

Picking the right 4xx status code

答案 2 :(得分:1)

在这里,这张照片非常好,而且我已多次使用过它。

Which code should I return?

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