路徑與查詢參數
客戶端把資料放進 URL 的方式只有兩種你每天都會用到:路徑參數(path parameter)寫在路徑裡,查詢參數(query parameter)接在 ? 後面。宣告型別之後,FastAPI 會轉換、驗證,並寫進 OpenAPI。
路徑參數
大括號標出路徑的可變部分:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
def read_user(user_id: int):
return {"user_id": user_id}
請求 GET /users/3 時,user_id 會是整數 3。若打 /users/abc,框架在進函式前就回 422,因為 abc 轉不成 int。
路徑也可以是字串。若同一前綴有固定路徑與參數路徑,固定路徑要寫在前面,否則 me 會被當成 {user_id}:
@app.get("/users/me")
def read_me():
return {"user_id": "the-current-user"}
@app.get("/users/{user_id}")
def read_user(user_id: str):
return {"user_id": user_id}
查詢參數
函式參數若不在路徑裡,就會被當成查詢參數:
@app.get("/items/")
def list_items(skip: int = 0, limit: int = 10, q: str | None = None):
return {"skip": skip, "limit": limit, "q": q}
對應 GET /items/?skip=20&limit=5&q=book。有預設值就是可選;沒有預設值就是必填。q: str | None = None 表示「可以不傳,傳了必須是字串」。
布林查詢參數接受 1 / true / on / yes 等常見寫法,都會轉成 True。
需要額外規則時用 Query 與 Path
只靠型別不夠時,再引入 Query、Path 加說明與限制:
from typing import Annotated
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(
item_id: Annotated[int, Path(ge=1, description="商品編號,必須 >= 1")],
q: Annotated[str | None, Query(max_length=50)] = None,
):
return {"item_id": item_id, "q": q}
Annotated 把「Python 型別」和「FastAPI 的額外設定」放在一起,編輯器看得到型別,文件也看得到說明。ge=1 擋掉 0 或負數;max_length 擋過長搜尋字串。
Cookie、Header 的寫法相同,只是改用 Cookie、Header。日常 CRUD 先把路徑與查詢練熟即可。