Skip to content

建立 2026-09-14 更新 2026-09-14

路徑與查詢參數

客戶端把資料放進 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

需要額外規則時用 QueryPath

只靠型別不夠時,再引入 QueryPath 加說明與限制:

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 的寫法相同,只是改用 CookieHeader。日常 CRUD 先把路徑與查詢練熟即可。

進一步學習