FastAPI HTTP 请求方式 (HTTP Methods)

FastAPI 支持标准的 HTTP 请求方法,用于指示对资源执行何种操作。常用的有:

  • GET: 获取资源。例如,获取用户信息、获取文章列表。
  • POST: 创建新资源。例如,用户注册、发布新文章。
  • PUT: 更新整个资源。例如,更新用户的所有信息。
  • PATCH: 部分更新资源。例如,仅更新用户的邮箱地址。
  • DELETE: 删除资源。例如,删除一篇文章。

这些方法通过路径操作装饰器指定,如 @app.get(…), @app.post(…) ,@app.put(…)等

FastAPI 请求参数类型区别 (Request Parameters)

FastAPI 会自动从请求的不同部分提取参数,并进行验证和转换。主要类型包括:

参数类型 应用位置 主要用途 定义方式 验证/元数据 何时使用
Path URL 路径 (/items/{item_id}) FastApi 在路径字符串中用 {} 定义,函数参数接收 Path(..., ge=1, le=100) 需要通过 URL 路径指定特定资源 ID 或分类时。
Query URL 查询字符串 (?q=hello&page=1) FastApi 函数参数,可设默认值 Query(default=10, ge=1, le=100) 需要传递可选或有时必要的非结构化、简单参数。如:过滤、分页、排序、可选参数。
Field HTTP的Body( ) 请求体 (通常 JSON) pydantic 定义 BaseModel,用 Field 添加规则,函数参数接收 Field(..., gt=0, max_length=100) 传递复杂、结构化数据POST, PUT, PATCH 请求中,需要接收详细数据(如用户信息、订单详情)时。

Path 和 Query 主要用于获取资源或传递简单的、扁平的参数。Field 用于传递复杂的数据结构,通常与 Pydantic 模型 配合使用,以确保数据的完整性和正确性。

以下是三个实例代码:

1、Path 参数 (路径参数)

from fastapi import FastAPI, Path # 导入 Path

app = FastAPI()

# --- 基础用法:获取用户信息 ---
@app.get("/users/{user_id}")
async def get_user(user_id: int): # user_id 是 Path 参数,类型为 int
    # 如果访问 /users/123,user_id 的值将是整数 123
    return {"user_id": user_id}
    
# --- 带验证和元数据的 Path 参数 ---
@app.get("/items/{item_id}")
async def read_item(item_id: int = Path(..., ge=1, le=1000, title="Item ID")): # ... 表示必填
    # ge=1: 验证 item_id >= 1
    # le=1000: 验证 item_id <= 1000
    # title: 用于 API 文档
    return {"item_id": item_id}

2. Query 参数 (路径查询参数)

from fastapi import FastAPI, Query # 导入 Query


app = FastAPI()

# --- 可选 Query 参数 ---
@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 100): # skip 和 limit 是 Query 参数
    # 如果访问 /items/?skip=10&limit=50,skip=10, limit=50
    # 如果访问 /items/,skip=0, limit=100 (使用默认值)
    return {"skip": skip, "limit": limit}
    
# --- 带验证规则的 Query 参数 ---
@app.get("/search/")
async def search_items(
    q: str = Query(default=None, min_length=3, max_length=50), # default=None 使其可选
    page: int = Query(1, ge=1, le=100), # 默认值 1,验证范围1~100
    sort_order: str = Query("desc", enum=["asc", "desc"]) # 排序限制为 "asc" 或 "desc"
):
    return {"q": q, "page": page, "sort_order": sort_order}

3、Field 参数 (Body( )请求体参数)

from fastapi import FastAPI, Body # 导入 Body
from pydantic import BaseModel, Field # 导入 BaseModel 和 Field

app = FastAPI()

# --- 定义请求体对象模型 ---
class Item(BaseModel):
    name: str = Field(..., title="Item Name", min_length=1, max_length=100) # ... 表示必填, 文本长度1~100
    remark: str = Field(None, title="Item remark", max_length=300 ) # 最大300长度
    price: float = Field(..., gt=0, description="Price must be greater than zero") #...必填,gt=0 验证 > 0
    tax: float = None

# --- 使用 Body 参数 ---
@app.post("/items/")
async def create_item(item: Item = Body(...)): # item 是HTTP的Body( )参数,类型为 Item对象
    # FastAPI 会自动解析 JSON 请求体,验证其结构和数据,并创建一个 Item 实例
    # item.name, item.price 等可以直接访问
    item_dict = item.dict() # 将模型实例转换为字典
    if item.tax:
        item_dict.update({"total": item.price + item.tax})
    return item_dict
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐