rest - POST 时数据不正确时的 HTTP 状态(使用不存在的资源 ID)
问题描述
当我执行 POST 请求以创建新用户时返回的正确 HTTP 状态是什么,但其中一个参数不正确 - 我包含在用户数据中的公司 ID 在数据库中不存在。
POST 数据:{用户名:'newuser',年龄:99,company_id:34 }
数据库中不存在 ID 为 34 的公司。
我在想这是否可能是:
- 400,一种无效数据,但它是有效但不存在的id
- 404 - 但不清楚哪个资源不存在
- 409,因为这是一种冲突,用户可以通过更改公司ID来解决
- 422?
- 或 500 - 因为这是一种数据库错误,而不允许存在不存在的 id
解决方案
400
或者422
首先,请记住这是一个客户端错误,因此5xx
状态代码不适合这里。你应该选择一个4xx
状态码。
请参阅RFC 4918中的以下引用(对于您的情况,只需阅读JSON当它说XML):
(
422
Unprocessable Entity) 状态码意味着服务器理解请求实体的内容类型(因此415
(Unsupported Media Type) 状态码是不合适的),并且请求实体的语法是正确的(因此是400
(Bad Request) 状态码不合适)但无法处理包含的说明。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会出现这种错误情况。
在这个答案中解决了类似的情况。
例如,如果负载的内容包含无效值(但在语法上有效) , GitHub API v3也会返回:422
接收请求正文的 API 调用存在三种可能的客户端错误类型:
发送无效的 JSON 将导致
400 Bad Request
响应。[...]发送错误类型的 JSON 值将导致
400 Bad Request response
. [...]发送无效字段将导致
422 Unprocessable Entity
响应。[...]
Michael Kropat整理了一组图表,在选择最合适的状态代码时非常有见地。4xx
状态码见下图:
推荐阅读
- amazon-web-services - 指向 s3 存储桶另一个帐户的 Lambda 层
- ios - 在移动视图内部时出现奇怪的 ScrollView 行为。SwiftUI
- javascript - 如何在javascript中解构对象并获取一个键的值?
- kdb - 连接两个具有不同行数的表 KDB
- database - AWS 访问密钥适用于本地主机,但不适用于部署
- pandas - 如何在真正的列名下添加一个额外的列名而不在熊猫中删除它?
- python-3.x - 使用 css_selector 在 aria-label 之后提取文本
- c++ - wxWidget 3.0.5 编译失败,OpenGL 库不可用
- python - 这些花括号在 python Django 中是什么意思?*{}*
- python - Python多行模式搜索