FastAPI POST接口接收JSON格式整数参数失败的原因咨询
FastAPI POST接口接收JSON格式整数参数失败的原因咨询
嗨,我来帮你梳理清楚这个问题的根源~
你的疑惑核心在于FastAPI对不同类型参数的默认解析规则差异,咱们一步步拆解:
为什么/ints接口用JSON传参失败?
在你的endpoints.py里,/ints接口的定义是:
@app.post('/ints') def post_int(x: int, y: int): return x, y
FastAPI默认会把单个基本类型(int、str、bool这类)的参数识别为查询参数(Query Parameters),也就是只会从URL的查询字符串(?x=1&y=2这种格式)里读取值,不会去解析请求体里的JSON内容。这就是为什么你用JSON传参时,会收到“x和y缺失”的错误提示。
为什么/lists接口用JSON传参却正常?
再看/lists接口的定义:
@app.post('/lists') def post_list(x: list[int], y: list[int]): return x, y
对于复杂类型(list、dict这类)的参数,FastAPI默认会把它们识别为**请求体(Request Body)**参数,会自动从JSON请求体里读取对应字段的值,所以你的JSON请求能正常生效。
怎么让/ints接口支持JSON传参?
有两种常用的解决方式,你可以根据需求选择:
方式1:用Body明确指定参数来源
修改endpoints.py的/ints接口,通过Body依赖告诉FastAPI要从请求体里读取这两个参数:
from fastapi import FastAPI, Body app = FastAPI() @app.post('/ints') def post_int(x: int = Body(), y: int = Body()): return x, y
方式2:用Pydantic模型定义请求体(更推荐)
如果后续参数可能增多,用Pydantic模型来封装请求体是更规范的做法:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() # 定义请求体的模型 class IntRequest(BaseModel): x: int y: int @app.post('/ints') def post_int(data: IntRequest): return data.x, data.y
修改后,你原来的requests.py里的JSON请求就能正常返回结果了。
补充说明FastAPI的参数解析逻辑
FastAPI会自动根据参数的类型和装饰器来推断参数来源:
- 单个基本类型 → 默认查询参数
- 复杂类型/自定义模型 → 默认请求体参数
- 如果需要改变默认规则,可以用
Query(指定为查询参数)、Body(指定为请求体)、Path(指定为路径参数)这些工具类来明确声明。
备注:内容来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

