2. 路径参数与类型转换

任务说明

实现一个 FastAPI 接口,通过路径参数接收用户ID,并演示 FastAPI 对路径参数的类型转换与校验能力。接口要求:/users/{user_id},其中 user_id 必须为整数;若传入非整数,接口应返回 422 校验错误。同时增加一个可选路径参数 /users/{user_id}/details/{detail_level},其中 detail_level 限定为 basic 或 full,演示枚举类型校验。

核心代码

from fastapi import FastAPI, Path
from enum import Enum

app = FastAPI()

class DetailLevel(str, Enum):
    basic = "basic"
    full = "full"

@app.get("/users/{user_id}")
def get_user(user_id: int = Path(..., description="用户ID,必须为整数")):
    return {"user_id": user_id, "type": type(user_id).__name__}

@app.get("/users/{user_id}/details/{detail_level}")
def get_user_details(
    user_id: int = Path(..., description="用户ID,必须为整数"),
    detail_level: DetailLevel = Path(..., description="详情级别:basic 或 full")
):
    return {
        "user_id": user_id,
        "detail_level": detail_level.value,
        "detail_type": type(detail_level).__name__
    }

类型转换与校验说明

FastAPI 基于 Python 类型注解自动完成以下工作:

  • 类型转换:声明 user_id: int 后,路径参数 "123" 会被自动转换为整数 123,响应中 type 字段显示为 int。
  • 类型校验:若请求 /users/abc,FastAPI 返回 422 错误,提示路径参数无法转换为整数。
  • 枚举校验:detail_level 使用 DetailLevel 枚举类型,请求 /users/1/details/advanced 时返回 422,仅接受 basic 或 full。

运行与验证

  1. 安装依赖:pip install fastapi uvicorn
  2. 保存代码为 main.py,启动服务:uvicorn main:app --reload
  3. 访问 http://127.0.0.1:8000/docs 查看自动生成的交互式 API 文档。

验证方法与判定标准

测试请求预期状态码预期响应
GET /users/123200{"user_id":123,"type":"int"}
GET /users/abc422校验错误,提示整数类型不匹配
GET /users/123/details/basic200{"user_id":123,"detail_level":"basic","detail_type":"DetailLevel"}
GET /users/123/details/advanced422校验错误,提示不在枚举值范围内

通过标准:上述请求返回的状态码与响应体与预期一致,即验证通过。

客户端 HTTP 请求 /users/123 FastAPI 应用 类型转换 str → int 枚举校验 basic / full 转换后 业务处理 接收 int 参数 返回 JSON 响应 200 JSON 校验失败 返回 422 错误 类型不匹配 验证观测点 路径参数类型转换 422 校验错误响应