Maison > développement back-end > Tutoriel Python > Erreur de requête FastAPI POST 422 : comment gérer correctement les données JSON ?

Erreur de requête FastAPI POST 422 : comment gérer correctement les données JSON ?

Patricia Arquette
Libérer: 2025-01-03 01:19:38
original
175 Les gens l'ont consulté

FastAPI POST Request Error 422: How to Properly Handle JSON Data?

FastAPI : compréhension et résolution de l'erreur 422 lors de l'envoi de données JSON via une requête POST

Description du problème

Construire une API avec FastAPI, le L'application affiche le code d'erreur 422 (entité non traitable) lors de l'envoi de données JSON via une requête POST. Les requêtes GET, en revanche, fonctionnent correctement. Ce problème persiste malgré les tentatives d'analyse de JSON, d'utilisation du codage UTF-8 ou de modification des en-têtes HTTP.

Explication détaillée

Une réponse avec le code d'état 422 indique une erreur avec les données soumises, souvent due à des éléments manquants ou mal formatés. Dans ce cas, le problème vient du format attendu de la requête POST. Par défaut, FastAPI anticipe les entrées de l'utilisateur en tant que paramètre de requête, et non en tant que charge utile JSON. Par conséquent, la tentative du client de transmettre des données JSON entraîne l'erreur 422.

Options de solution

Les quatre options suivantes offrent des approches distinctes pour définir un point de terminaison qui correctement traite les données JSON d'une requête POST :

1. Utilisation de modèles Pydantic

L'utilisation de modèles Pydantic vous permet de spécifier une structure de données attendue pour votre point de terminaison.

from pydantic import BaseModel

class User(BaseModel):
    user: str

@app.post('/')
def main(user: User):
    return user
Copier après la connexion

2. Utilisation du paramètre Body Embed

Cette méthode utilise le paramètre spécial "embed" pour traiter le corps comme un paramètre unique.

from fastapi import Body

@app.post('/')
def main(user: str = Body(..., embed=True)):
    return {'user': user}
Copier après la connexion

3. Utilisation d'un type Dict (moins recommandé)

Bien que moins recommandée, cette approche définit une paire clé-valeur comme un type Dict.

from typing import Dict, Any

@app.post('/')
def main(payload: Dict[Any, Any]): 
    return payload
Copier après la connexion

4 . Utilisation directe de l'objet Request

Cette option implique l'utilisation de l'objet Request pour analyser les données JSON reçues.

from fastapi import Request

@app.post('/')
async def main(request: Request): 
    return await request.json()
Copier après la connexion

Test des solutions

Pour tester les solutions fournies, suivez les instructions données étapes :

Utilisation de la bibliothèque de requêtes Python

import requests

url = 'http://127.0.0.1:8000/'
payload ={'user': 'foo'}
resp = requests.post(url=url, json=payload)
print(resp.json())
Copier après la connexion

Utilisation de l'API de récupération JavaScript

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);
    });
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal