Désolé, je ne maîtrise pas Python.

Je n'ai pas trouvé la documentation pour ce cas d'utilisation. Comment puis-je obtenir le corps de la requête, m'assurer qu'il s'agit d'un Json valide ( tout json valide , y compris les nombres, les chaînes, les booléens et les valeurs nulles, pas seulement les objets et les tableaux) et obtenir le Json réel. L'utilisation de pydantic force le Json à avoir une structure spécifique.

1
Alejandro Navas 15 oct. 2020 à 23:18

4 réponses

Meilleure réponse

Vous pouvez trouver presque tout à l'intérieur de l'objet Request

Vous pouvez obtenir le corps de la requête avec request.body()

from fastapi import Request, FastAPI

@app.post("/dummypath")
async def get_body(request: Request):
    return await request.body()
2
Yagiz Degirmenci 7 déc. 2020 à 15:26

Si vous êtes sûr que les données entrantes sont "un JSON valide" , vous pouvez créer une structure annotation de type simple pour recevoir les données JSON arbitraires .

from fastapi import FastAPI
from typing import Any, Dict, AnyStr, List, Union

app = FastAPI()

JSONObject = Dict[AnyStr, Any]
JSONArray = List[Any]
JSONStructure = Union[JSONArray, JSONObject]


@app.post("/")
async def root(arbitrary_json: JSONStructure = None):
    return {"received_data": arbitrary_json}

Exemples

1. Objet JSON

curl -X POST "http://0.0.0.0:6022/" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"test_key\":\"test_val\"}"

Réponse:

{
  "received_data": {
    "test_key": "test_val"
  }
}

2. Tableau JSON

curl -X POST "http://0.0.0.0:6022/" -H  "accept: application/json" -H  "Content-Type: application/json" -d "[\"foo\",\"bar\"]"

Réponse:

{
  "received_data": [
    "foo",
    "bar"
  ]
}

Si vous n'êtes pas sûr du type de contenu des données entrantes, mieux vaut analyser le corps de la requête .

Cela peut être fait comme,

from fastapi import FastAPI, Request

app = FastAPI()


@app.post("/")
async def root(request: Request):
    return {"received_request_body": await request.body()}

L'avantage de cette méthode est que le corps contiendra tout type de données, JSON, form-data, multipart-form-data, etc.

0
Arakkal Abu 16 oct. 2020 à 04:30

La réponse acceptée est également valide, mais FastAPI fournit un moyen intégré de le faire - vérifiez la Section des valeurs singulières dans le corps de la documentation.

Un paramètre avec la valeur par défaut Body récupère toute la charge utile qui ne correspond pas aux paramètres de type Pydantic passés (la charge utile entière dans notre cas) et la convertit en dict. En cas de JSON invalide, une erreur de validation standard serait produite.

from fastapi import Body, FastAPI

app = FastAPI()


@app.post("/test}")
async def update_item(
        payload: dict = Body(...)
):
    return payload
0
Oleh Rybalchenko 2 déc. 2020 à 18:54
from fastapi import Request

async def synonyms__select(request: Request):
    return await request.json()

Renverra un objet JSON.

0
GyuHyeon Choi 4 déc. 2020 à 16:37