I'm using FastAPI and I'm trying to send a JSON array of JSON objects to my post endpoint, in the body. My endpoint is defined as:
@router.post("/create_mails")
def create_mails(notas: List[schemas.Nota], db: Session = Depends(get_db)):
My body in Postman looks like:
{
"notas": [{"a":"1","b":"2","c":"3","d":"4"},
{"a":"1","b":"2","c":"3","d":"4"}]
}
However, I keep getting the 422 unprocessable entity error from FastAPI, with the error detail:
value is not a valid list
I also tested it with a modified endpoint:
@router.post("/create_mails")
def create_mails(notas: List[str] = Body([]), db: Session = Depends(get_db)):
and with a simple string array, but the same error is returned.
Am I missing FastAPI's definition of a valid list?
Your POST method parameter needs to model the entire request body, which is indeed a single object, and not a list.
To match the body you're trying to send, you'd need something like:
class NotaList(BaseModel):
notas: List[Nota]
and then:
def create_mails(body: schemas.NotaList)
Note that the parameter name in your function is not part of the data model, it just represents the "top-level" body object. I've renamed it to body
here to clarify that. The notas
in the request body will get assigned to the notas
member of the class, so inside your method you'll access things like (for example):
for nota in body.notas:
# do stuff