Usando FastAPI en un modo sincronizado , no asíncrono, me gustaría poder recibir el cuerpo RAW, sin cambios, de una solicitud de publicación.
Todos los ejemplos que puedo encontrar muestran código asíncrono, cuando lo pruebo de forma normal, el request.body() lo muestra como un objeto coroutine.
Y cuando lo pruebo publicando algo de XML en este punto final, obtengo un 500 "Error interno del servidor"
from fastapi import FastAPI, Response, Request, Body app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.post("/input") def input_request(request: Request): # how can I access the RAW request body here? body = request.body() # do stuff with the body here return Response(content=body, media_type="application/xml")¿Esto no es posible con FastAPI?
Nota: una solicitud de entrada simplificada se vería así
POST http://127.0.0.1:1083/input Content-Type: application/xml <XML> <BODY>TEST</BODY> </XML>y no tengo control sobre cómo se envían las solicitudes de entrada, porque necesito reemplazar una API SOAP existente
Si un objeto es co-rutinario, debe esperarse. FastAPI se basa en Starlette, y los métodos de Starlette para devolver el cuerpo de la solicitud son métodos asíncronos ; por lo tanto, debe "esperarlos".
Alternativamente, si está seguro de que los datos entrantes son un JSON válido, puede usar el campo Cuerpo , como se muestra a continuación:
@app.post("/input") def input_request(payload: dict = Body(...)): return payload Sin embargo, si los datos entrantes están en formato XML, como en el ejemplo que proporcionó, podría ser mejor pasarlos a través de archivos (como se muestra a continuación), utilizando un módulo de tempfile en su cliente.
@app.post("/input") def input_request(file: bytes = File(...)): return file