FastAPI post does not recognize my parameter

Question:

I am usually using Tornado, and trying to migrate to FastAPI.

Let’s say, I have a very basic API as follows:

@app.post("/add_data")
async def add_data(data):
    return data

When I am running the following Curl request:
curl http://127.0.0.1:8000/add_data -d 'data=Hello'

I am getting the following error:

{"detail":[{"loc":["query","data"],"msg":"field required","type":"value_error.missing"}]}

So I am sure I am missing something very basic, but I do not know what that might be.

Asked By: Djoby

||

Answers:

Since you are sending a string data, you have to specify that in the router function with typing as

from pydantic import BaseModel


class Payload(BaseModel):
    data: str = ""


@app.post("/add_data")
async def add_data(payload: Payload = None):
    return payload

Example cURL request will be in the form,

curl -X POST "http://0.0.0.0:6022/add_data"  -d '{"data":"Hello"}'
Answered By: JPG

In your case, you passing a form data to your endpoint. To process it, you need to install python-multipart via pip and rewrite your function a little:

from fastapi import FastAPI, Form

app = FastAPI()

@app.post('/add_data')
async def process_message(data: str = Form(...)):
    return data

If you need json data, check Arakkal Abu’s answer.

Answered By: Alexey Sherchenkov

FastAPI docs advise this solution for strings in body:

  • just add Body(), like data: str = Body().

Complete example:

from fastapi import Body

@app.post("/add_data")
async def add_data(data: str = Body()):
    return data

That tells FastAPI that the value is expected in body, not in the URL.

Answered By: elano7
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.