Tengo el siguiente punto final en mi servidor FastAPI:
@app.post("/submit") async def submit(file1: List[UploadFile] = File(...), file2: List[UploadFile] = File(...), file3: List[UploadFile] = File(...)): # do something return 'hello' Funciona como se esperaba si uso la interfaz de usuario de Swagger. Sin embargo, no puedo entender cómo enviar una solicitud POST a este punto final usando el módulo de requests de Python. Esto es lo que he probado:
import requests headers = { 'accept': 'application/json', 'Content-Type': 'multipart/form-data', } files = [ ('file1', open('file1.zip', 'rb')), ('file2', open('file2.txt', 'rb')), ('file3', open('file3.rar', 'rb')), ] response = requests.post('http://localhost:8000/submit', headers=headers, files=files) print(response.text)Pero estoy recibiendo un error:
{"detail":"There was an error parsing the body"}Debe definir cada file como un parámetro separado en el punto final, por ejemplo, file1: UploadFile = File(...) , file2: UploadFile = File(...) , etc. (sin usar List ) o, preferiblemente, defina una List de archivos usando files: List[UploadFile] = File(...) , como se muestra a continuación (lo siguiente se puede usar para devolver los nombres de archivo de todos los archivos cargados).
@app.post("/submit") async def submitUPP(files: List[UploadFile] = File(...)): # do something return {"Uploaded Files:": [file.filename for file in files]} En el lado del cliente, debe enviar la lista de archivos usando la misma key que proporcionó en el punto final (es decir, files en el caso anterior) para cada archivo.
files = [ ('files', open('file1.zip', 'rb')), ('files', open('file2.txt', 'rb')), ('files', open('file3.rar', 'rb')), ]Es posible que también desee echar un vistazo a this y this answer.
Además de lo anterior, no se debe establecer el Content-Type en los encabezados en multipart/form-data cuando se usan archivos, sino dejar que las solicitudes de Python establezcan el Content-Type , además de multipart/form-data , Content-Type debe incluir la cadena boundary utilizada para separar cada parte del cuerpo en la carga útil de varias partes). Por favor, eche un vistazo a las respuestas aquí y aquí . Establecer el Content-Type la forma en que lo hace es la razón del error que encontró, es decir, {'detail': 'There was an error parsing the body'} . Por lo tanto, debe evitar establecer el Content-Type en los encabezados.