介绍
URL:/student?name=李雷&age=18,在 ? 后面,函数参数不在路径 {} 里就是查询参数。
应用场景
- 条件查询、分页、排序,不会改变服务器资源,都是 GET 请求。
如B站搜索 王者荣耀 的URL:https://search.bilibili.com/all?vt=79105200&keyword=王者荣耀from_source=web_search&search_source=5
1. 基础用法
URL中不加 {},如:@app.get('/student')
例子
from fastapi import FastAPI
app = FastAPI()
@app.get('/student')
async def get_student(name:str):
print(f"根据{name}进行查询!" )
return {
"name":name,
"sex":"男"
}
测试:成功
访问:http://127.0.0.1:8000/student?name=lilei ,浏览器显示如下:
{
"name": "lilei",
"sex": "男"
}
- 类型会自动转换,传字符串会自动校验报错
测试:不传参数
不传参数:直接返回422参数校验错误
访问:http://127.0.0.1:8000/student ,浏览器显示如下:
{
"detail": [
{
"type": "missing",
"loc": [
"query",
"name"
],
"msg": "Field required",
"input": null
}
]
}
解释:
"type": "missing",:错误类型,缺失参数query:表示查询参数name:表示查询参数namemsg": "Field required:错误信息,翻译:需要字段"input": null:表示输入的是null,即:没传参数
类型声明
直接在函数参数写类型,FastAPI自动做 解析、校验
支持类型
str:默认类型,几乎可以接受任意类型参数int?age=18,转成int类型的18?age=12.3、?age=abc,校验报错422
float?price=99.99,转成float类型的99.99?price=100,转为100.0
bool?man=true、?man=1,转为True?man=false、?man=0,转为False
bytes:URL 传入 base64 编码字符串,自动解码为 bytes。uuid.UUID访问
?id=550e8400‑e29b‑41d4‑a71c‑95a26cf3d479正常转换格式不对直接报
422错误
2. 多个参数
需要传入 name、age
注意:age 是 int 类型
如下:
@app.get('/student')
async def get_student(name:str,age:int):
print(f"根据{name}、{age} 进行查询!" )
return {
"name":name,
"age":age
}
测试成功
访问:http://127.0.0.1:8000/student?name=lilei&age=18 ,浏览器显示:
{
"name": "lilei",
"age": 18
}
注意:传入 18,自动转为 int 类型
测试类型转换失败
访问:http://127.0.0.1:8000/student?name=lilei&age=a ,浏览器显示:
{
"detail": [
{
"type": "int_parsing",
"loc": [
"query",
"age"
],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "a"
}
]
}
解释:
因为 age=a,不能将 a 转为 int 类型,所以报错
"type": "int_parsing",:错误类型query:表示查询参数age:表示查询参数agemsg": "Input should be a valid integer, unable to parse string as an integer:错误信息,翻译:应该输入integer类型,否则不能将字符串转为integer类型"input": "a":表示输入的是a
3. 设置默认值
在大学管理系统中,一般学生年龄是 18 岁,所以可设置默认值是 18
@app.get('/student')
async def get_student(name:str,age:int = 18):
print(f"根据{name}、{age} 进行查询!" )
return {
"name":name,
"age":age
}
测试:不传年龄
访问 http://127.0.0.1:8000/student?name=lilei ,不传年龄,那么年龄就取默认值 18,浏览器显示如下:
{
"name": "lilei",
"age": 18
}
测试:传年龄
访问 http://127.0.0.1:8000/student?name=lilei&age=16 ,传年龄,那么年龄就取传入的 16,浏览器显示如下:
{
"name": "lilei",
"age": 16
}
4. 可选查询参数(允许None)
给默认值 None,参数可以不传
@app.get('/student')
async def get_student(name:str,age:int | None = None):
print(f"根据{name}、{age} 进行查询!" )
return {
"name":name,
"age":age
}
测试:不传年龄
访问 http://127.0.0.1:8000/student?name=lilei ,不传年龄,那么年龄就取默认值 18,浏览器显示如下:
{
"name": "lilei",
"age": null
}
测试:传年龄
访问 http://127.0.0.1:8000/student?name=lilei&age=16 ,传年龄,那么年龄就取传入的 16,浏览器显示如下:
{
"name": "lilei",
"age": 16
}