13

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.

1
  • Future readers might find this answer and this answer helpful as well. Commented Apr 27, 2023 at 5:21

3 Answers 3

11

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"}'
Sign up to request clarification or add additional context in comments.

3 Comments

Thank you it works! I am however a bit confused why I need to define a BaseModel for post API but not get.
In your get request, the data are being sent as query parameters whereas here as payload
And you don't have to hard-code input parameters (such as data field in Payload), see how to pass and receive any dict or JSON, without having to predefine its keys: stackoverflow.com/a/70879659/9962007
2

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.

Comments

0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.