422 是什么
422 Unprocessable Content 表示「请求读得懂,但内容语义上无法处理」:格式合法、语法没问题,可是字段校验不过、引用的资源不存在,或业务规则不满足。它最早由 WebDAV 定义为 Unprocessable Entity(RFC 4918),后被 RFC 9110 纳入并改名为 Unprocessable Content。REST 接口普遍把它当表单校验错误的标准返回码。
基本信息
| 名称与状态码 | 422 Unprocessable Content |
|---|---|
| 语义 | 语法正确但语义有误,无法处理 |
| 规范 | RFC 9110 §15.5.21(历史定义见 RFC 4918 §11.2) |
| 与 400 的分工 | 400 管读不懂语法,422 管读懂了但不合理 |
| 响应体惯例 | 逐字段列出校验失败原因 |
| 常见框架 | FastAPI、Django REST、Rails、Laravel 均有内置支持 |
典型使用场景
- 表单字段校验失败:邮箱格式错误、手机号位数不对、必填项缺失
- 业务规则不满足:库存不足、余额不够、状态机不允许该操作
- 引用的关联资源不存在:提交的订单号、用户 ID 查不到
- 内容语义冲突:日期区间起止颠倒、金额为负这类逻辑错误
- 让前端能按字段粒度提示用户,而不是丢一个笼统的 400
校验错误响应示例
校验错误响应示例
# 提交一个格式不合法的邮箱
curl -si -X POST https://api.example.com/users \
-H 'Content-Type: application/json' \
-d '{"email":"not-an-email","age":-3}'
# 服务端返回 422 并逐字段说明
# HTTP/1.1 422 Unprocessable Content
# {"errors":{"email":"invalid format","age":"must be positive"}}4xx 语义分工
| 状态码 | 含义 | 判定依据 |
|---|---|---|
| 400 Bad Request | 请求语法错误,根本读不懂 | JSON 解析失败、参数类型错 |
| 401 Unauthorized | 缺少或无效的凭证 | 没有 Token 或已过期 |
| 403 Forbidden | 凭证有效但无权限 | 角色不具备该操作权限 |
| 404 Not Found | 资源不存在 | 路径或 ID 查不到 |
| 409 Conflict | 与当前资源状态冲突 | 并发写入、唯一键重复 |
| 422 | 语法正确但语义有误 | 字段校验、业务规则不通过 |
团队内要先约定 400 与 422 的边界,前端才能统一处理:常见约定是「JSON 结构错误 → 400,字段值不合法 → 422」,并在响应体里固定一个 errors 字段名承载字段级信息。
把服务端自身故障(数据库连不上、下游超时)也返回 422,会让监控统计与归因彻底失真——这类问题属于 5xx,422 只能表达「请求方的内容有问题」。