3. 请求体模型与Pydantic校验
任务说明
实现一个FastAPI接口,接收查询参数并处理默认值与可选参数。接口需支持必填参数、带默认值的参数以及完全可选的参数三种情况,并返回参数接收结果的JSON响应。
接口设计
- 路径:
GET /search - 必填参数:
q(字符串),未提供时返回422错误 - 默认值参数:
page(整数),默认值为1 - 可选参数:
size(整数),类型为Optional[int],未提供时为None
代码实现
from typing import Optional
from fastapi import FastAPI, Query
from pydantic import BaseModel
app = FastAPI()
class SearchResponse(BaseModel):
query: str
page: int
size: Optional[int] = None
@app.get("/search", response_model=SearchResponse)
async def search_items(
q: str = Query(..., description="搜索关键词"),
page: int = Query(1, ge=1, description="页码,从1开始"),
size: Optional[int] = Query(None, ge=1, le=100, description="每页数量,可选")
):
"""接收查询参数并返回回显结果"""
return SearchResponse(query=q, page=page, size=size)
关键实现说明
q使用Query(..., ...)声明为必填,省略时FastAPI自动返回422校验错误page默认值为1,同时通过ge=1限制最小值为1size声明为Optional[int]且默认None,客户端不传时响应中该字段为null- 使用Pydantic模型
SearchResponse作为响应模型,确保返回结构清晰
运行与验证
- 安装依赖:
pip install fastapi uvicorn - 启动服务:
uvicorn main:app --reload(假设代码保存为main.py) - 打开交互文档:
http://127.0.0.1:8000/docs,在/search接口中测试以下场景
验证用例与预期结果
| 请求URL | 预期HTTP状态 | 预期响应体 |
|---|---|---|
/search?q=fastapi | 200 | {"query":"fastapi","page":1,"size":null} |
/search?q=python&page=3 | 200 | {"query":"python","page":3,"size":null} |
/search?q=test&page=2&size=50 | 200 | {"query":"test","page":2,"size":50} |
/search(缺少q) | 422 | 校验错误,提示q字段缺失 |
/search?q=bad&page=0 | 422 | 校验错误,提示page小于最小值1 |
判定标准
- 上述5个用例的返回状态码与响应体与预期完全一致
- 未传
size时响应中该字段为null,而非缺失 - 传了
size但超出1~100范围时返回422