持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
查询参数
- URL中
?后面按照a=10&b=20形式组织的参数成为查询参数,如:参数a的值是10, 参数b的值是20 - 在URL中查询参数是可选的,并且如有的话,默认后端接收的原始值都是字符串,所以一般也称之为
查询字符串参数。
fastapi中的查询参数
- 路径操作函数内,声明不属于路径参数的其他函数参数,默认被认为是查询参数,且是字符串类型。
- 比如:这个url中
http://127.0.0.1:8000/items/?skip=0&limit=10, 参数skip是字符串0,参数limit是字符串10 - 这两个参数如果相当int使用,则需要做类型转换。
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip, limit):
skip = int(skip)
limit = int(limit)
return fake_items_db[skip: skip + limit]
- 上面的例子中,当你为查询参数做了类型提示,它们将转换为该类型并针对该类型进行校验。
- 比如:这个url中
http://127.0.0.1:8000/items/?skip=0&limit=10, 因为做了类型提示,所以不需要手动做类型转换。
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int, limit: int):
print(skip, limit)
return fake_items_db[skip: skip + limit]
- 如果定义了查询字符串参数,但是在URL中并没有提供查询字符串参数
- 例如上面的例子,如果URL是
http://127.0.0.1:8000/items/或者http://127.0.0.1:8000/items/?skip=0,因为在URL中缺少了一个或两个查询参数。此时服务会响应422 Unprocessable Entity并返回响应的错误提示
{"detail":[{"loc":["query","skip"],"msg":"field required","type":"value_error.missing"},{"loc":["query","limit"],"msg":"field required","type":"value_error.missing"}]}
{"detail":[{"loc":["query","limit"],"msg":"field required","type":"value_error.missing"}]}
查询参数默认值
- 如果定义了查询参数,但是URL中可能没有查询参数,此时一个方便的解决思路就是给查询参数提供默认值。
- 设置默认值的方式是非常方便的,只需要在定义查询参数时给一个那默认值即可。
- 此时如果URL中缺少哪个查询参数,缺少的查询参数的值就是默认值。
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip: skip + limit]
- 因为有了默认值,此时查询参数的类型提示是可以省略的,fastapi会根据默认值自动推动参数类型。
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip=0, limit=10):
return fake_items_db[skip: skip + limit]