を構築するFastAPI を使用した API では、POST リクエストを通じて JSON データを送信するときに、アプリケーションでエラー コード 422 (処理できないエンティティ) が表示されます。一方、GET リクエストはスムーズに動作します。この問題は、JSON の解析、UTF-8 エンコードの使用、または HTTP ヘッダーの変更を試みても解決しません。
422 ステータス コードを含む応答は、次のことを示しています。送信されたデータのエラー。多くの場合、要素の欠落または誤ったフォーマットが原因です。この場合、問題は POST リクエストの予期される形式に起因しています。デフォルトでは、FastAPI はユーザー入力を JSON ペイロードとしてではなくクエリ パラメーターとして想定します。その結果、クライアントが JSON データを送信しようとすると 422 エラーが発生します。
次の 4 つのオプションは、エンドポイントを正しく定義するための個別のアプローチを提供します。 POST リクエストからの JSON データを処理します:
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}
あまり推奨されませんが、このアプローチはキーと値のペアを辞書型として定義します。
from typing import Dict, Any @app.post('/') def main(payload: Dict[Any, Any]): return payload
このオプションには、Request オブジェクトを使用して受信した 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 中国語 Web サイトの他の関連記事を参照してください。