2. 路径参数与类型转换

任务说明

实现一个FastAPI端点,接收路径参数,并利用FastAPI的类型转换能力自动完成参数校验与类型转换。当参数类型不匹配时,自动返回422校验错误;当参数超出约束范围时,同样返回422错误。

核心实现

from fastapi import FastAPI, Path
from typing import Annotated

app = FastAPI()

# 商品数据库(模拟)
PRODUCTS = {
    1: {"name": "键盘", "price": 299.0},
    2: {"name": "鼠标", "price": 129.0},
    3: {"name": "显示器", "price": 1999.0},
}

@app.get("/products/{product_id}")
async def get_product(
    product_id: Annotated[int, Path(ge=1, le=1000, description="商品ID,范围1-1000")]
):
    """按ID查询商品,路径参数自动转换为int类型并校验范围"""
    if product_id not in PRODUCTS:
        return {"error": "商品不存在"}
    product = PRODUCTS[product_id]
    return {
        "product_id": product_id,
        "name": product["name"],
        "price": product["price"],
    }

@app.get("/users/{user_id}/orders/{order_id}")
async def get_user_order(
    user_id: Annotated[int, Path(ge=1, description="用户ID")],
    order_id: Annotated[int, Path(ge=1, description="订单ID")]
):
    """多路径参数示例:查询指定用户的指定订单"""
    return {
        "user_id": user_id,
        "order_id": order_id,
        "message": f"查询用户{user_id}的订单{order_id}"
    }

代码说明

上述代码实现了两个端点:

  • GET /products/{product_id}:路径参数product_id声明为int类型,FastAPI会自动将URL中的字符串转换为整数。若传入非数字(如/products/abc),自动返回422校验错误。通过Path(ge=1, le=1000)约束取值范围,超出范围同样返回422。
  • GET /users/{user_id}/orders/{order_id}:演示多个路径参数的场景,每个参数独立进行类型转换与校验。

运行与验证

  1. 安装依赖:pip install fastapi uvicorn
  2. 保存代码为main.py,启动服务:uvicorn main:app --reload
  3. 访问交互式文档:http://127.0.0.1:8000/docs,可直观看到参数类型与约束说明。

验证方法与判定标准

测试请求预期结果判定标准
GET /products/1返回商品1的JSON数据HTTP 200,响应体包含"name": "键盘"
GET /products/abc422校验错误HTTP 422,响应体包含"type": "int_parsing"错误详情
GET /products/0422校验错误HTTP 422,响应体包含"ge": 1约束信息
GET /products/1001422校验错误HTTP 422,响应体包含"le": 1000约束信息
GET /products/999返回{"error": "商品不存在"}HTTP 200,业务逻辑正常处理
GET /users/5/orders/10返回两个参数均被正确解析为intHTTP 200,响应体包含"user_id": 5和"order_id": 10

判定标准:上述请求均返回预期HTTP状态码与响应结构,即验证通过。类型转换失败(非数字)与范围越界均由FastAPI自动拦截,无需在函数体内编写额外判断逻辑。

路径参数类型转换与校验流程 客户端请求 GET /products/1 GET /products/abc GET /products/0 GET /users/5/orders/10 FastAPI 路由匹配 /products/{product_id} /users/{user_id}/orders/{order_id} 类型转换 + 参数校验 str → int 自动转换 Path(ge=1, le=1000) 范围约束 类型错误 → 422 校验失败 返回 HTTP 422 + 错误详情 校验成功 调用端点函数,参数已为int类型 查询商品/订单 → 返回JSON 绿色:自动转换与校验;橙色:失败路径