7.Request_Body.md

last update: 2025-06-07

除了使用 Pydantic 模型定義資料結構,FastAPI 也允許以更動態的方式接收 JSON,搭配 Body(None) 可處理選填資料,並手動解析成 Python dict。


使用 Body(None) 接收原始 JSON

from 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