Reputation: 742
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.
Upvotes: 13
Views: 16580
Reputation: 2255
FastAPI docs advise this solution for strings in body:
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.
Upvotes: 0
Reputation: 503
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.
Upvotes: 2
Reputation: 88429
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"}'
Upvotes: 11