FastAPI接收多键请求体时返回422 Unprocessable Entity错误排查
FastAPI接收多键请求体时返回422 Unprocessable Entity错误排查
嘿,我来帮你捋捋这个头疼的问题!明明之前好好的,迁移后就突然报422错误,换谁都得懵,我给你拆解下可能的原因和解决办法。
首先看你的情况:你想让客户端直接发送包含archived、user这类多键的JSON请求体,接口里用filter: dict = Body(..., embed=False)接收,但FastAPI却提示body里的data字段缺失——这确实有点反常,咱们一步步来解决。
最直接的修复方案
方案一:去掉Body参数,直接用dict接收整个请求体
这是FastAPI里接收完整请求体最简洁也最不容易踩坑的写法,FastAPI会自动把客户端发送的整个JSON请求体绑定到这个单个dict参数上,完全不需要额外的Body修饰:
@router.post("/search") def search(filter: dict) -> list: return []
把代码改成这样,再用你原来的客户端请求测试,应该就能正常接收了,这也是很多FastAPI开发者常用的写法。
方案二:调整Body参数的配置(如果一定要保留Body)
如果你确实需要用Body参数做额外配置,那可以试试更明确的写法,确保FastAPI把整个请求体映射到filter参数上:
from fastapi import Body, APIRouter router = APIRouter() @router.post("/search") def search( filter: dict = Body(..., embed=False, media_type="application/json"), ) -> list: return []
这里要注意,不同版本的FastAPI对embed参数的处理可能有细微差异,你是迁移后出的问题,不妨检查下新旧环境的FastAPI版本是否一致,说不定是版本更新导致的逻辑变化。
额外排查点
如果上面的方案都没解决,你可以再检查这两个地方:
- 看看你的路由有没有挂载到带依赖项的APIRouter上,会不会是某个依赖在偷偷期望
data字段? - 确认客户端发送的请求体格式,比如有没有不小心发成Form数据而不是JSON?不过从你的客户端代码看,用
json=data是没问题的。
备注:内容来源于stack exchange,提问作者raul ferreira
相关产品推荐
相关产品推荐

