4. 请求体与Pydantic模型

任务说明

本案例将实现一个FastAPI接口,通过Pydantic模型接收JSON请求体,并利用Pydantic的字段类型与约束条件自动完成数据校验。当客户端提交非法数据时,接口自动返回422校验错误;提交合法数据时,接口回显接收到的内容。

核心实现

```python # main.py from fastapi import FastAPI from pydantic import BaseModel, Field, EmailStr app = FastAPI() class UserCreate(BaseModel): username: str = Field(..., min_length=3, max_length=20, description="用户名") age: int = Field(..., ge=0, le=120, description="年龄") email: EmailStr = Field(..., description="邮箱") tags: list[str] = Field(default_factory=list, max_length=5, description="标签") @app.post("/users/") async def create_user(user: UserCreate): return { "message": "用户数据校验通过", "received": user.model_dump() } ```

代码说明

上述代码定义了UserCreate模型,其中:

  • username:字符串类型,长度限制3~20字符;
  • age:整数类型,范围0~120;
  • email:使用EmailStr类型自动校验邮箱格式(需安装email-validator);
  • tags:字符串列表,最多5个元素,默认空列表。

FastAPI将请求体JSON反序列化为UserCreate实例,校验失败时自动返回422错误及详细原因,无需手动编写校验逻辑。

依赖安装与启动

```bash pip install fastapi uvicorn pydantic[email] uvicorn main:app --reload --port 8000 ```

接口验证

启动服务后,使用以下命令测试接口行为:

```bash # 合法请求:应返回200及回显数据 curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"username":"alice","age":25,"email":"alice@example.com","tags":["python","fastapi"]}' # 非法请求1:age超出范围,应返回422 curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"username":"bob","age":150,"email":"bob@example.com"}' # 非法请求2:email格式错误,应返回422 curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"username":"carol","age":30,"email":"not-an-email"}' ```

判定标准

  • 合法请求返回HTTP 200,响应体包含"message": "用户数据校验通过"及回显数据;
  • 非法请求返回HTTP 422,响应体包含"detail"字段,其中明确指出哪个字段违反了哪条约束(如age小于0或大于120、email格式不合法等);
  • 缺失必填字段(如username)同样返回422,提示field required。
客户端 curl / 浏览器 FastAPI 服务 POST /users/ async def create_user Pydantic 模型 UserCreate username: str (3-20) age: int (0-120) email: EmailStr JSON 请求体 反序列化+校验 校验失败 返回 422 校验通过 返回 200 422 响应示例 {"detail": [ {"loc": ["body","age"], "msg": "ensure this value is less than or equal to 120"}]} 200 响应示例 {"message": "用户数据校验通过", "received": {"username": "alice", "age": 25, ...}}

验证要点

启动服务后,依次执行上述三条curl命令。观察返回状态码与响应体:合法请求返回200且回显数据与提交一致;两条非法请求均返回422,且detail数组中准确指出违规字段与原因。若email校验未生效,请确认已安装pydantic[email]依赖。通过以上验证,即表明Pydantic模型已成功完成请求体的类型与约束自动校验。