FastAPI接口无法正确接收Postman Raw JSON请求问题排查
问题原因分析
你的接口参数定义和请求方式不匹配,导致JSON Body传递的参数未被正确接收:
- 当前接口里的
company_name是查询参数(Query Parameter),FastAPI默认会从URL的Params中读取这个值,而非JSON请求体。 - 当你用Raw JSON Body传
{"parameter":{"company_name":"panda"}}时,接口没有定义对应的解析规则去读取这个嵌套结构的请求体,所以company_name始终是默认值None。最终CRUD函数执行的是Audit.company_name == None的查询,自然只返回company_name为null的数据。
解决方案
根据你的请求结构需求,提供两种可选方案:
方案1:支持嵌套结构的JSON请求体
先定义Pydantic模型来匹配你的JSON结构,再修改接口解析请求体:
# 导入Pydantic模型基类 from pydantic import BaseModel # 定义嵌套的请求体结构 class Parameter(BaseModel): company_name: str | None = None class FilterRequest(BaseModel): parameter: Parameter # 修改接口函数 @router.post("/filter/filtering") async def filter_test( skip: int = 0, limit: int = 100, req_body: FilterRequest | None = None, # 接收JSON请求体 db: Session = Depends(get_db) ): # 从嵌套结构中提取company_name company_name = req_body.parameter.company_name if req_body else None _audits = crud.filter_test(db, company_name) return Response(status="Ok", code="200", message="Success fetch all data", result=_audits)
方案2:支持平级JSON请求体(简化结构)
如果可以简化请求JSON为{"company_name":"panda"},直接用Body标记参数为请求体参数即可:
from fastapi import Body @router.post("/filter/filtering") async def filter_test( skip: int = 0, limit: int = 100, company_name: str | None = Body(None), # 指定从请求体读取参数 db: Session = Depends(get_db) ): _audits = crud.filter_test(db, company_name) return Response(status="Ok", code="200", message="Success fetch all data", result=_audits)
额外优化建议
- 恢复CRUD函数里的
if company_name:判断,这样当参数为空时返回所有数据,而非仅company_name为null的数据:
def filter_test(db: Session, company_name: str = None): query = db.query(Audit) if company_name: query = query.filter(Audit.company_name == company_name) # 顺便用上接口定义的skip和limit参数,实现分页 return query.offset(skip).limit(limit).all()
- 如果需要同时支持URL Params和JSON Body传递参数,可以在接口中同时接收两种来源的参数,再做优先级判断(比如优先取请求体参数)。
内容的提问来源于stack exchange,提问作者hanbb
相关产品推荐
相关产品推荐

