RESTful API を構築するとき、特に POST リクエストが関係する場合、データ交換に関連する問題が発生することがよくあります。そのような問題の 1 つは、JSON データを送信しようとしているときに「422 Unprocessable Entity」エラーを受信することです。
提供されたコード例では:
from fastapi import FastAPI app = FastAPI() @app.post("/") def main(user): return user
このコードは、JSON を予期する POST エンドポイントを定義します。 「user」キーを含むペイロード。ただし、HTTP クライアントが予期された形式と一致しない JSON データを送信すると、エラーが発生します。これを解決するには、いくつかのオプションがあります:
Pydantic モデルは、事前定義されたスキーマに従って JSON ペイロードを検証および逆シリアル化する方法を提供します:
from pydantic import BaseModel class User(BaseModel): user: str @app.post("/") def main(user: User): return user
ボディ パラメータFastAPI では、Pydantic モデルを定義せずに JSON ペイロードを直接解析できます。
from fastapi import Body @app.post("/") def main(user: str = Body(..., embed=True)): return {'user': user}
あまり推奨されていませんが、Dict 型を使用して、キーと値のペアとしての JSON ペイロード:
from typing import Dict, Any @app.post("/") def main(payload: Dict[Any, Any]): return payload
受信データが有効な JSON であることが確実な場合は、Starlette の Request オブジェクトを使用して解析できます。
from fastapi import Request @app.post("/") async def main(request: Request): return await request.json()
Python リクエストを使用してこれらのオプションをテストします。ライブラリ:
import requests url = 'http://127.0.0.1:8000/' payload = {'user': 'foo'} resp = requests.post(url=url, json=payload) print(resp.json())
JavaScript Fetch API:
fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({'user': 'foo'}) }) .then(resp => resp.json()) // or, resp.text(), etc .then(data => { console.log(data); // handle response data }) .catch(error => { console.error(error); });
これらのアプローチのいずれかを実装することで、422 エラーを解決し、JSON を正常に処理できます。 FastAPI POST エンドポイントのデータ。
以上がJSON POST リクエストを受信したときに FastAPI の 422 エラーを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。