7.Request_Body.md
last update: 2025-06-07
除了使用 Pydantic 模型定義資料結構,FastAPI 也允許以更動態的方式接收 JSON,搭配 Body(None)
可處理選填資料,並手動解析成 Python dict。
使用 Body(None)
接收原始 JSON
Body(None)
接收原始 JSONfrom fastapi import FastAPI, Body
import json
app = FastAPI()
@app.post("/raw-json")
def handle_raw_json(payload=Body(None)):
if payload is None:
return {"error": "no body received"}
# payload 已是 dict,可直接使用
return {
"type": str(type(payload)),
"keys": list(payload.keys())
}
前端呼叫範例
fetch("/raw-json", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({
name: "Keyboard",
price: 350.5,
in_stock: false
})
});
當 JSON 為文字格式時手動轉換
若你刻意從前端傳送字串型 JSON(不建議),可使用 json.loads()
將其轉換為 Python dict:
@app.post("/string-json")
def parse_json_text(data: str = Body(...)):
try:
parsed = json.loads(data)
return {"parsed": parsed}
except json.JSONDecodeError:
return {"error": "Invalid JSON string"}
前端傳送範例:
fetch("/string-json", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify("{\"name\": \"CY\", \"score\": 99}")
});
小結
方法
用法與特性
Body(None)
接收原始 JSON,可為 None
,適合彈性 API 接收資料
字串手動解析 JSON
搭配 json.loads()
將 JSON 字串轉為 dict
這種寫法在開發快速原型、處理動態或半結構化資料時很有彈性,但若資料結構明確仍建議優先使用 Pydantic
進行資料驗證與型別控制。
Last updated