422错误是Pydantic在请求进入路由函数前因语义校验失败而拦截,主因包括字段名与JSON键不匹配、缺失类型注解导致参数解析通道错误、字段约束触发、嵌套模型缺失、Content-Type非application/json等。

422 错误不是后端挂了,也不是网络不通,而是 Pydantic 在请求刚进来、还没进你的 async def 函数时,就判定数据“语义不合格”,直接拦截并返回标准错误响应。
Pydantic 模型字段名和前端 JSON 键名不一致
FastAPI 默认严格按字段名匹配 JSON 的 key,大小写、下划线、拼写差一个字符都会触发 422。
- 模型定义
user_name: str,但前端发{"username": "alice"}→ 必报 422 - 解决方法:用
alias显式指定接收名,例如user_name: str = Field(..., alias="username") - 或统一启用
alias_generator(如 snake_case ↔ camelCase),但前后端必须同步约定,不能只改后端
没写类型注解,FastAPI 默认当 query 参数处理
如果路由函数参数没加类型提示,比如 async def posttest(s):,FastAPI 会把 s 当作查询参数(?s=xxx),而你前端却发了 JSON body → 两边根本不在同一通道上。
- 现象:前端 POST
{"s": "test"},后端报错loc: ["query", "s"], msg: "field required" - 修复:明确标注为 body 参数,例如
s: str = Body(...)或封装进 Pydantic 模型data: MyModel - 别依赖自动推导——没类型注解 = 没契约,422 是提醒你补上
字段类型或约束在解析阶段就失败
Pydantic v2 的字段级约束(如 constr(min_length=6)、EmailStr)会在反序列化时立刻执行,失败即 422,连 @validator 和你写的 if 都不会运行。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
立即学习“Python免费学习笔记(深入)”;
- 传空字符串给
int字段、"true"给bool、"user@com"给EmailStr→ 全部卡在入口 - 嵌套模型缺失或为
null(如profile: Profile但没传profile对象)→ 同样 422 - 业务规则(如“密码需含数字+特殊字符”)别塞进模型,移到路由函数里手动校验 + 抛
HTTPException(status_code=400)
Content-Type 不是 application/json 或 body 被污染
FastAPI 只对 Content-Type: application/json 自动解析 body。其他情况(如 text/plain、没设 header、Postman 选了 Text 而非 JSON)会导致 Pydantic 收不到结构化数据。
- Axios 别手动
JSON.stringify()却不设 header;用axios.post(url, data)即可,它会自动设 header 并序列化 - Postman 中确认 Body → raw → JSON(而非 Text)
- 调试时加一行
print(await request.body())和print(request.headers.get("content-type")),看真实内容到底是什么
最常被忽略的点:422 错误体里的 detail 字段其实自带定位信息,loc 元组(如 ["body", "user", "email"])已经指明出问题的层级和字段,别跳过它直接重写模型。

















