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
Patricia Arquetteoriginal
2025-01-03 01:19:38136parcourir

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

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}

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

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()

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())

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);
    });

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!

Déclaration:
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