You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:15:31