Apabila membina API RESTful, adalah perkara biasa untuk menghadapi isu yang berkaitan dengan pertukaran data, terutamanya apabila permintaan POST terlibat . Satu isu sedemikian ialah menerima ralat "422 Entiti Tidak Boleh Diproses" semasa cuba menghantar data JSON.
Dalam contoh kod yang disediakan:
from fastapi import FastAPI app = FastAPI() @app.post("/") def main(user): return user
Kod ini mentakrifkan titik akhir POST yang menjangkakan JSON muatan yang mengandungi kunci "pengguna". Walau bagaimanapun, ralat berlaku apabila klien HTTP menghantar data JSON yang tidak sepadan dengan format yang dijangkakan. Untuk menyelesaikan masalah ini, terdapat beberapa pilihan:
Model Pydantic menyediakan cara untuk mengesahkan dan menyahsiri muatan JSON mengikut skema yang telah ditetapkan:
from pydantic import BaseModel class User(BaseModel): user: str @app.post("/") def main(user: User): return user
Parameter badan dalam FastAPI membenarkan anda menghuraikan secara langsung muatan JSON tanpa mentakrifkan model Pydantic:
from fastapi import Body @app.post("/") def main(user: str = Body(..., embed=True)): return {'user': user}
Walaupun kurang disyorkan, anda boleh menggunakan jenis Dict untuk menerima JSON muatan sebagai pasangan nilai kunci:
from typing import Dict, Any @app.post("/") def main(payload: Dict[Any, Any]): return payload
Jika anda pasti bahawa data yang masuk adalah JSON yang sah, anda boleh menggunakan objek Permintaan Starlette untuk menghuraikannya:
from fastapi import Request @app.post("/") async def main(request: Request): return await request.json()
Anda boleh uji pilihan ini menggunakan:
Permintaan Python perpustakaan:
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); });
Dengan melaksanakan salah satu pendekatan ini, anda boleh menyelesaikan ralat 422 dan berjaya mengendalikan JSON data dalam titik akhir FastAPI POST anda.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Ralat 422 FastAPI Apabila Menerima Permintaan JSON POST?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!