使用FastAPI 建立API,該應用程式在透過POST 請求發送JSON資料時顯示錯誤代碼 422(無法處理的實體)。另一方面,GET 請求則運作順利。儘管嘗試解析 JSON、使用 UTF-8 編碼或修改 HTTP 標頭,此問題仍然存在。
帶有 422 狀態代碼的回應表示提交的資料出現錯誤,通常是由於元素缺失或格式不正確造成的。在本例中,問題源自於 POST 請求的預期格式。預設情況下,FastAPI 將使用者輸入視為查詢參數,而不是 JSON 負載。因此,客戶端嘗試傳輸 JSON 資料會導致 422 錯誤。
以下四個選項提供了不同的方法來正確定義端點處理來自POST 請求的JSON 資料:
1。使用 Pydantic 模型
使用 Pydantic 模型可讓您為端點指定預期的資料結構。
from pydantic import BaseModel class User(BaseModel): user: str @app.post('/') def main(user: User): return user
此方法利用特殊的「embed」參數將主體視為單一參數。
from fastapi import Body @app.post('/') def main(user: str = Body(..., embed=True)): return {'user': user}
雖然不太推薦,但此方法將鍵值對定義為 Dict 類型。
from typing import Dict, Any @app.post('/') def main(payload: Dict[Any, Any]): return payload
此選項涉及使用請求物件來解析接收到的 JSON 資料。
from fastapi import Request @app.post('/') async def main(request: Request): return await request.json()
要測試提供的解決方案,請按照給定的步驟:
import requests url = 'http://127.0.0.1:8000/' payload ={'user': 'foo'} resp = requests.post(url=url, json=payload) print(resp.json())
fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({'user': 'foo'}) }) .then(resp => resp.json()) .then(data => { console.log(data); }) .catch(error => { console.error(error); });
以上是FastAPI POST 請求錯誤 422:如何正確處理 JSON 資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!