当我执行POST请求以创建新用户时, correct HTTP status to return 会是什么,但其中一个参数不正确 - 我在数据库中不存在包含用户数据的公司ID .
POST数据:{用户名:'newuser',年龄:99, company_id: 34 }
the company with id 34 does not exist in the database.
我在想是否可能是这样的:
-
400,一种无效数据,但它是有效但不存在的ID
-
404 - 但不清楚哪个资源不存在
-
409,因为它是一种冲突,用户可以通过更改公司ID来解决这个问题
-
422?
-
或500 - 因为它是一种数据库错误,而不存在不存在的id
3 回答
404 Not Found
是为POST
请求返回的有问题的状态 . 它意味着您发送请求的资源不存在;调用者得到的URL错误 .最明显(和通用)的答案是:
400 Bad Request
这只表示您的请求有问题(错误在于调用者而不是服务器),然后表达您的响应正文中出错的具体细节 . 这通常是处理请求验证的方式 .
理想的答案是通过向他们所属的公司发送请求来添加用户:
这意味着调用者必须找到一个有效的
company
资源来发送请求 . 如果company/34
不存在,则404 Not Found
响应是合适的;您尝试将用户添加到不存在的公司 .这意味着您的API必须使用资源语义进行结构化,并且用户必须属于一个公司 .
在这里,这张照片非常好,而且我已经多次使用它了 .
Which code should I return?
我会选择404.资源可能存在(不是格式错误)但它没有(因此无法找到) .
400或422
首先,请保持最小值为client error,因此5xx状态代码不适用于此处 . 您应该选择一个4xx状态代码 .
最明显的选项是400和422:
如果JSON在语法上无效,则返回400 .
如果JSON在语法上有效但其内容无效,则返回422以指示服务器无法处理请求实体 .
请参阅RFC 4918中的以下引用(对于您的情况,只需在读取XML时读取JSON):
类似的情况在answer中得到了解决 .
例如,如果有效内容的内容包含无效值(但在语法上有效),GitHub API v3也会返回422:
Michael Kropat整理了一个set of diagrams,在选择最合适的状态代码时非常有见地 . 有关
4xx
状态代码,请参见下图: