FastAPI 对 路由传参的分类、校验、解析做了极致的封装和标准化 ,是目前最规范的现代化 Web 框架,没有之一。你关注的 query、path(params)、body、form 是 FastAPI 最核心的传参方式,其中 path 和 params 是同一个概念(路径参数),本文会基于 FastAPI 完整、系统、实战化的讲透所有参数类型,包含「语法 + 完整示例 + 参数校验 + 使用场景 + 核心区别」,所有代码可直接复制运行。
✅ 前置核心:FastAPI 路由基础
1. 路由的本质
路由 = 请求URL地址 + HTTP请求方法(GET/POST/PUT/DELETE) 的组合,FastAPI 通过装饰器匹配路由,核心作用:接收前端请求,分发到对应的处理函数,返回响应数据。
2. FastAPI 路由基础语法
python
from fastapi import FastAPI
import uvicorn
# 创建FastAPI实例
app = FastAPI(title="FastAPI 请求参数实战", version="1.0")
# 基础路由:请求方法 + 路由地址 + 处理函数
@app.get("/") # GET请求,匹配根路径
async def root():
return {"msg": "FastAPI 路由参数详解"}
if __name__ == '__main__':
uvicorn.run("main:app", reload=True, host="127.0.0.1", port=8000)
运行后访问 http://127.0.0.1:8000/docs 即可打开 FastAPI 自动生成的接口文档,所有参数都会自动生成调试界面,这是 FastAPI 的核心优势之一。
3. 核心前提:HTTP 请求方法与传参的强绑定规则
和所有 Web 框架一致,参数传递的位置 由 HTTP 请求方法的设计规则决定,这是所有传参的基础,记牢这条规则,永远不会用错参数:
✅ GET 类请求(GET/HEAD):只有请求头、无请求体 ,参数只能放在 URL 中(query/path),无法传递 body/form 参数,FastAPI 会直接忽略。
✅ POST 类请求(POST/PUT/DELETE/PATCH):有请求头 + 请求体,参数可以放 URL(query/path),也可以放请求体(body/form),推荐放请求体,更安全、支持海量数据。
✅ 一、路径参数 Path Params(你写的 path/params,同一个概念)
✅ 定义
路径参数 是 将参数直接嵌入到 URL 的路由路径中 ,是 RESTful API 的标准传参方式,FastAPI 中官方标准名称是Path 参数,params 是别名,二者完全等价,没有区别。
✅ 语法规则
- 路由中用
{参数名}声明路径参数,直接写在 URL 地址里 - 处理函数中同名定义参数变量 ,FastAPI 会自动解析、自动注入到函数中
- 路径参数是必填项,请求时不传则路由匹配失败,直接返回 404 错误
✅ 基础使用示例(核心必学)
python
# 1. 单个路径参数:根据用户ID查询用户信息
@app.get("/user/{user_id}")
async def get_user(user_id): # 函数参数名 必须和 路由中的{user_id}一致
return {"msg": "获取路径参数成功", "user_id": user_id, "type": type(user_id)}
# 2. 多个路径参数:根据年份+月份查询订单
@app.get("/order/{year}/{month}")
async def get_order(year, month):
return {"msg": "获取多个路径参数成功", "data": {"year": year, "month": month}}
访问测试:
http://127.0.0.1:8000/user/1001→ 返回{"user_id": "1001", ...}http://127.0.0.1:8000/order/2026/01→ 返回{"year": "2026", "month": "01", ...}
✅ 进阶:路径参数的「类型注解 + 自动校验」(FastAPI 杀手锏)
FastAPI 最大的优势之一:通过 Python 的类型注解,实现参数的自动类型转换 + 自动校验 + 自动报错,无需手动处理!
python
# 给路径参数添加类型注解:int/float/str/bool
@app.get("/user/{user_id}")
async def get_user(user_id: int): # 指定user_id必须是整数
return {"msg": "路径参数类型校验成功", "user_id": user_id, "type": type(user_id)} # type 是 int
- 正确请求:
/user/1001→ 正常返回,参数自动转为int类型 - 错误请求:
/user/abc→ FastAPI 自动返回422 校验错误,提示值不是有效的整数,无需写一行校验代码!
✅ 核心特点 & 适用场景
✅ 特点:
- 参数是 URL 路径的一部分,语义化极强,符合 RESTful 最佳实践
- 必填项,声明了就必须传,否则 404,强制约束前端传参
- 参数明文显示在 URL 中,所有请求方法都支持(GET/POST 均可)
- 支持自动类型注解、校验、转换,开发效率拉满
✅ 适用场景:根据「唯一标识」操作资源 → 查询单个用户、删除指定 ID 商品、查询指定订单号的订单,一句话总结:单个资源的精准操作,必用路径参数。
✅ 二、查询参数 Query Params(最常用)
✅ 定义
查询参数 是 拼接在 URL 地址 ? 后面的键值对参数,也叫「查询字符串参数」,是 FastAPI 中使用频率最高的参数类型。
✅ 语法规则
- 路由地址是纯路径,不需要声明占位符
- 处理函数中直接定义参数变量,FastAPI 会自动识别为查询参数,无需额外装饰器
- 查询参数是可选参数 ,前端不传则后端拿到的是
None,灵活性极高 - 多个查询参数用
&分隔,格式:url?key1=value1&key2=value2
✅ 基础使用示例(核心必学)
python
# 基础查询参数:分页查询用户列表
@app.get("/user/list")
async def get_user_list(page, size, keyword=None): # keyword是可选参数,默认None
return {
"msg": "获取查询参数成功",
"data": {"page": page, "size": size, "keyword": keyword}
}
访问测试:
http://127.0.0.1:8000/user/list?page=1&size=10→ 返回keyword: Nonehttp://127.0.0.1:8000/user/list?page=1&size=10&keyword=张三→ 返回keyword: 张三
✅ 进阶:查询参数的「类型注解 + 默认值 + 必选设置」
python
# 类型注解+默认值:page默认1,size默认10,都是int类型;keyword可选str
@app.get("/user/list")
async def get_user_list(page: int = 1, size: int = 10, keyword: str = None):
return {"data": {"page": page, "size": size, "keyword": keyword}}
# 必选查询参数:不给默认值即可,前端不传则自动报错
@app.get("/search")
async def search(keyword: str): # keyword是必选,不传则422错误
return {"msg": "必选查询参数", "keyword": keyword}
✅ 核心特点 & 适用场景
✅ 特点:
- 参数拼接在 URL 的
?后,可选性极强,可传可不传,默认值友好 - 明文显示在 URL 中,所有请求方法都支持(GET/POST 均可)
- 同样支持自动类型注解、校验、转换
- URL 有长度限制(浏览器一般限制 2048 字符),但日常查询足够用
✅ 适用场景:数据的筛选、分页、搜索、条件查询 → 列表分页、关键词搜索、多条件筛选商品、排序查询,一句话总结:所有带条件的批量查询,必用查询参数。
✅ 三、请求体参数 Body Params(核心,POST 系列请求专属)
✅ 定义
请求体参数 是 放在 HTTP 请求体中的参数 ,不会出现在 URL 中 ,是独立的、隐藏的参数载体,也是 FastAPI 中处理「提交 / 修改数据」的核心传参方式,没有之一。
✅ 核心前置规则(重中之重,必看)
- GET 请求 绝对没有请求体:HTTP 协议规定,FastAPI 会直接忽略 GET 请求的 body 参数,即使前端传了也拿不到。
- 必须用 POST/PUT/DELETE/PATCH :只有这类请求才有请求体,最常用的是
POST。 - 需要定义数据模型 :FastAPI 推荐用
Pydantic的BaseModel定义请求体的结构,实现自动校验、自动解析、自动生成接口文档。
✅ 语法规则
- 从
pydantic导入BaseModel,定义数据模型类,声明字段名 + 类型 + 默认值 - 处理函数中定义该模型类的参数,FastAPI 会自动解析请求体数据并注入
- 请求体参数支持任意复杂数据结构:对象、嵌套对象、数组、字典等
✅ 基础使用示例(核心必学,90% 的业务接口用这个)
python
from pydantic import BaseModel
# 步骤1:定义请求体的数据模型(Pydantic BaseModel)
class UserInfo(BaseModel):
username: str # 必填字段,字符串类型
password: str # 必填字段,字符串类型
age: int = None # 可选字段,整数类型,默认None
hobby: list = None # 可选字段,数组类型
# 步骤2:POST请求 + 接收请求体参数
@app.post("/user/login") # 必须用post,不能用get
async def user_login(user: UserInfo): # 参数是定义好的模型类
# 直接通过 对象.属性 获取参数
return {
"msg": "请求体参数获取成功",
"data": {
"username": user.username,
"password": user.password,
"age": user.age,
"hobby": user.hobby
}
}
✅ 请求测试
前端传递 JSON 格式的请求体数据即可:
javascript
{
"username": "zhangsan",
"password": "123456",
"age": 20,
"hobby": ["篮球", "编程"]
}
FastAPI 会自动解析为 UserInfo 对象,直接调用属性即可,无需手动处理 JSON。
✅ 核心特点 & 适用场景
✅ 特点:
- 隐式传递 :不在 URL 中显示,安全性极高,不会被浏览器记录、不会被抓包轻易获取(配合 HTTPS 更安全)
- 无数据量限制:可以传递任意大小、任意格式的数据,远超 URL 的长度限制
- 支持复杂结构:嵌套对象、数组、字典等,满足所有业务场景
- 自动校验 + 自动生成文档:字段类型错误、必填项缺失都会自动返回 422 错误,接口文档自动生成请求体示例
✅ 适用场景:所有提交 / 修改 / 删除数据的操作 → 用户登录、注册、新增数据、修改个人信息、提交表单、上传复杂数据,一句话总结:只要是写操作(增删改),必用请求体参数。
✅ 四、表单参数 Form Params(表单专属)
✅ 定义
表单参数(Form) 是 前端 HTML 表单提交的专用参数 ,本质是「请求体的一种特殊格式」,对应的 HTTP 请求头 Content-Type: application/x-www-form-urlencoded,和 Body 是「包含关系」:Form 是特殊的 Body,Body 是通用的请求体。
✅ 核心前置说明
- Form 参数 只支持 POST 请求,和 Body 参数互斥(同一个接口不能同时接收 Body 和 Form)
- FastAPI 中需要手动导入
Form类,并对函数参数进行标注 - 适用于「传统 HTML 表单提交」,比如
<form method="post">提交的数据 - 如果表单中有文件上传 ,需要用
File和Form配合,对应格式multipart/form-data
✅ 语法规则 & 完整示例
python
from fastapi import Form # 必须手动导入Form
# 接收表单参数:每个参数都要用 Form(...) 标注
@app.post("/form/submit")
async def form_submit(
username: str = Form(...), # ... 表示必填项
password: str = Form(...),
age: int = Form(None) # 可选参数,默认None
):
return {
"msg": "表单参数获取成功",
"data": {"username": username, "password": password, "age": age}
}
✅ 前端表单对应代码
html
<!-- 传统HTML表单,提交后会自动匹配后端的Form参数 -->
<form action="http://127.0.0.1:8000/form/submit" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
年龄:<input type="number" name="age"><br>
<button type="submit">提交表单</button>
</form>
✅ 核心特点 & 适用场景
✅ 特点:
- 专用于传统表单提交,参数格式是键值对,和 Query 参数格式一致,但放在请求体中
- 必须显式导入
Form并标注,否则 FastAPI 会识别为查询参数 - 支持必填 / 可选、类型注解、自动校验,和其他参数一致
✅ 适用场景:传统网页的表单提交 → 登录表单、注册表单、留言板、简单数据提交,前后端分离项目中很少用(前后端分离一般用 JSON 格式的 Body 参数)。
✅ 五、补充:混合传参(FastAPI 高频实战场景)
FastAPI 最强大的特性之一:完美支持「路径参数 + 查询参数 + 请求体参数」混合使用,无需任何额外配置,FastAPI 会自动区分、解析、注入,这是开发中最常用的实战场景!
✅ 混合传参完整示例(必学,面试 / 开发高频)
python
from pydantic import BaseModel
class UserUpdateInfo(BaseModel):
nickname: str
age: int = None
# 混合传参:路径参数(user_id) + 查询参数(is_vip) + 请求体参数(UserUpdateInfo)
@app.put("/user/{user_id}") # 修改数据用PUT请求,语义更规范
async def update_user(
user_id: int, # 自动识别:路径参数
is_vip: bool = False, # 自动识别:查询参数
user_info: UserUpdateInfo # 自动识别:请求体参数
):
return {
"msg": "混合传参成功",
"path_params": user_id,
"query_params": is_vip,
"body_params": user_info.dict()
}
访问测试:PUT http://127.0.0.1:8000/user/1001?is_vip=True请求体传:{"nickname": "张三", "age": 20}FastAPI 会自动解析三类参数,完美兼容!
✅ 六、核心参数对比表(必背,面试 / 开发高频)
整理了所有参数的核心差异 + FastAPI 专属特性,这是最容易混淆的点,吃透这张表,参数使用永不出错:
|----------|--------------|--------------------|---------------|----------|-------------|-----------------|-------------------------|
| 参数类型 | 英文名称 | FastAPI 使用方式 | 参数位置 | 是否明文 | 必填 / 可选 | 支持请求方法 | 核心适用场景 |
| 路径参数 | Path Params | 路由 {参数名}+ 函数同名参数 | URL 路径中 | ✅是 | 必填 | 所有 (GET/POST) | 按 ID 查 / 删数据、RESTful 接口 |
| 查询参数 | Query Params | 函数直接定义参数 | URL? 后面 | ✅是 | 可选 | 所有 (GET/POST) | 分页、筛选、搜索、条件查询 |
| 请求体参数 | Body Params | Pydantic BaseModel | HTTP 请求体 | ❌否 | 可选 | POST/PUT/DELETE | 登录、注册、新增 / 修改数据 |
| 表单参数 | Form Params | 导入 Form 标注参数 | HTTP 请求体 (表单) | ❌否 | 可选 | POST | 传统 HTML 表单提交 |
✅ 七、FastAPI 传参 最佳实践(避坑指南 + 规范,重中之重)
✅ 1. 传参方式「黄金原则」(绝对不要违反)
- 查数据 → GET + Path/Query:GET 语义是「查询」,符合 HTTP 规范,且 GET 请求可被浏览器缓存,性能更好;单条查用 Path,批量查用 Query。
- 增数据 → POST + Body:POST 语义是「提交」,数据放请求体,安全且支持复杂结构。
- 改数据 → PUT + Path + Body:用 Path 传资源 ID(比如 /user/{id}),用 Body 传修改的内容,语义最规范。
- 删数据 → DELETE + Path:用 Path 传资源 ID,极简高效,比如 /delete/{id}。
- 敏感数据 → 只传 Body :密码、token、手机号等敏感信息,绝对不要用 Path/Query,明文暴露在 URL 中极易被窃取。
✅ 2. FastAPI 专属避坑点
- GET 请求拿不到 Body/Form 参数:这是 HTTP 协议规则,不是 FastAPI 的问题,不要做无用功。
- Form 和 Body 不能共存:同一个接口中,不能同时接收 Form 和 Body 参数,FastAPI 会报错,二者选其一即可。
- 路径参数是必填项:声明了 {参数名} 就必须传,否则 404,不要忘记传参。
- 类型注解一定要加:FastAPI 的自动校验、类型转换、接口文档都依赖类型注解,不加就失去了核心优势。
✅ 3. 命名规范
- 路径参数:用名词单数 + ID,比如
/user/{user_id}、/order/{order_id}。 - 查询参数:用小写 + 下划线,比如
page_size、key_word、is_vip。 - 请求体模型:用大驼峰,比如
UserInfo、OrderCreate,字段用小写 + 下划线。
✅ 总结(核心知识点提炼)
- FastAPI 中 Path 和 Params 是同一个概念(路径参数),Query 是查询参数,二者都在 URL 中,是 GET 请求的主力传参方式。
- Body 是请求体参数,Form 是表单参数,二者都在请求体中,是 POST 请求的主力传参方式,Form 是 Body 的子集。
- 查用 GET,写用 POST/PUT/DELETE,这是 HTTP 的语义规范,也是 FastAPI 的最佳实践。
- FastAPI 的核心优势:类型注解 + Pydantic 模型,实现参数的自动解析、校验、文档生成,开发效率和代码规范性拉满。
所有示例代码都可以直接复制运行,配合 uvicorn 启动即可,希望这篇内容能帮你彻底吃透 FastAPI 的路由与请求参数! 🚀