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}:演示多个路径参数的场景,每个参数独立进行类型转换与校验。
运行与验证
- 安装依赖:
pip install fastapi uvicorn - 保存代码为
main.py,启动服务:uvicorn main:app --reload - 访问交互式文档:
http://127.0.0.1:8000/docs,可直观看到参数类型与约束说明。
验证方法与判定标准
| 测试请求 | 预期结果 | 判定标准 |
|---|---|---|
GET /products/1 | 返回商品1的JSON数据 | HTTP 200,响应体包含"name": "键盘" |
GET /products/abc | 422校验错误 | HTTP 422,响应体包含"type": "int_parsing"错误详情 |
GET /products/0 | 422校验错误 | HTTP 422,响应体包含"ge": 1约束信息 |
GET /products/1001 | 422校验错误 | HTTP 422,响应体包含"le": 1000约束信息 |
GET /products/999 | 返回{"error": "商品不存在"} | HTTP 200,业务逻辑正常处理 |
GET /users/5/orders/10 | 返回两个参数均被正确解析为int | HTTP 200,响应体包含"user_id": 5和"order_id": 10 |
判定标准:上述请求均返回预期HTTP状态码与响应结构,即验证通过。类型转换失败(非数字)与范围越界均由FastAPI自动拦截,无需在函数体内编写额外判断逻辑。