前面幾天處理的都是放在網址列上的資料(路徑與查詢參數)。但實務上,如果要新增一筆完整的資料,通常會將資料包裝成 JSON 格式,放在 Request Body 中傳遞,這樣不僅能傳遞複雜的結構,也比較安全。
這時就輪到 FastAPI 的核心好夥伴「Pydantic」上場了。我們透過繼承 Pydantic 的 BaseModel 來定義資料的綱要(Schema)。
請將 main.py 改寫成這樣:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items/")
def create_item(item: Item):
item_dict = item.model_dump()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
在這段程式碼中,我們定義了 Item 模型,其中 name 和 price 是必填,description 和 tax 是選填。
當前端發送 POST 請求並附帶 JSON 時,FastAPI 會自動將 JSON 轉換為對應的 Python 型別,並驗證必填欄位。如果前端漏傳了 name 欄位,或者把 price 傳成字串 "一百",API 會自動擋下請求並回傳清楚的錯誤提示,這大幅降低了我們寫 if/else 來檢查資料格式的痛苦。