Membina API dengan FastAPI, aplikasi mempamerkan kod ralat 422 (Entiti Tidak Boleh Diproses) semasa menghantar data JSON melalui permintaan POST. GET permintaan, sebaliknya, berfungsi dengan lancar. Isu ini berterusan walaupun terdapat percubaan untuk menghuraikan JSON, menggunakan pengekodan UTF-8 atau mengubah suai pengepala HTTP.
Jawapan dengan kod status 422 menunjukkan ralat dengan data yang diserahkan, selalunya disebabkan unsur yang hilang atau tidak diformatkan dengan betul. Dalam kes ini, masalah berpunca daripada format permintaan POST yang dijangkakan. Secara lalai, FastAPI menjangka input pengguna sebagai parameter pertanyaan, bukan sebagai muatan JSON. Akibatnya, percubaan pelanggan untuk menghantar data JSON mengakibatkan ralat 422.
Empat pilihan berikut menawarkan pendekatan yang berbeza untuk menentukan titik akhir yang betul memproses data JSON daripada POST permintaan:
Menggunakan model Pydantic membolehkan anda menentukan struktur data yang dijangkakan untuk titik akhir anda.
from pydantic import BaseModel class User(BaseModel): user: str @app.post('/') def main(user: User): return user
Kaedah ini menggunakan parameter "benam" khas untuk merawat badan sebagai parameter tunggal.
from fastapi import Body @app.post('/') def main(user: str = Body(..., embed=True)): return {'user': user}
Walaupun kurang disyorkan, pendekatan ini mentakrifkan pasangan nilai kunci sebagai jenis Dict.
from typing import Dict, Any @app.post('/') def main(payload: Dict[Any, Any]): return payload
Pilihan ini melibatkan penggunaan objek Permintaan untuk menghuraikan data JSON yang diterima.
from fastapi import Request @app.post('/') async def main(request: Request): return await request.json()
Untuk menguji penyelesaian yang disediakan, ikuti yang diberikan langkah:
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); });
Atas ialah kandungan terperinci Ralat Permintaan FastAPI POST 422: Bagaimana Mengendalikan Data JSON Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!