3. 请求体模型与Pydantic校验

请求体模型与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限制最小值为1
  • size声明为Optional[int]且默认None,客户端不传时响应中该字段为null
  • 使用Pydantic模型SearchResponse作为响应模型,确保返回结构清晰

运行与验证

  1. 安装依赖:pip install fastapi uvicorn
  2. 启动服务:uvicorn main:app --reload(假设代码保存为main.py)
  3. 打开交互文档:http://127.0.0.1:8000/docs,在/search接口中测试以下场景

验证用例与预期结果

请求URL预期HTTP状态预期响应体
/search?q=fastapi200{"query":"fastapi","page":1,"size":null}
/search?q=python&page=3200{"query":"python","page":3,"size":null}
/search?q=test&page=2&size=50200{"query":"test","page":2,"size":50}
/search(缺少q)422校验错误,提示q字段缺失
/search?q=bad&page=0422校验错误,提示page小于最小值1

判定标准

  • 上述5个用例的返回状态码与响应体与预期完全一致
  • 未传size时响应中该字段为null,而非缺失
  • 传了size但超出1~100范围时返回422
客户端 HTTP 请求 FastAPI 服务 GET /search 参数解析与校验 默认值填充 SearchResponse query: str page: int = 1 size: Optional[int] ?q=关键词&page=2 (size可选) 校验通过 JSON 响应(含默认值与null) 422 校验错误(缺少必填参数或非法值) 请求路径 服务处理 响应模型 错误分支