Reputation: 179
I have implemented a endpoint in FastAPI and I am testing it from Postman. But whenever I send request I get this error "There was an error parsing the body", while searching for the error I found a solution somewhere that I need to have python-multipart installed, this package is already installed but I am still facing this error. Following is my code:
@router.put('/user')
def update_user(user_data: dict):
from crain.uma import update_user
user_id = user_data['id']
update_user(user_id, user_data)
return {"message": "DONE"}
The endpoint except a dict like this:
user_data = {
"username":"admin",
"id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
"email":null,
"firstName":"admin",
"lastName":"admin",
"createdTimestamp":1638268009973
},
Upvotes: 2
Views: 11229
Reputation: 34045
In short, your endpoint expects JSON
data, but your client sends form-data
instead. Thus, when sending the request through Postman, you should go to Body
, then choose raw
, and finally, select JSON
from the dropdown list, as described in this answer.
Additioanlly, I would highly sugget to use Pydantic models for sending JSON data, as described in the documentation. Thus, you can make use of the data validation that Pydantic offers. You can even use EmailStr
type for validating email inputs (requires email-validator to be installed, as described in the documentation). Example below:
from pydantic import BaseModel, EmailStr
from datetime import datetime
class User(BaseModel):
username: str
id: str
email: EmailStr = None
firstName: str
lastName: str
createdTimestamp: datetime
@app.put('/user')
def update_user(user_data: User):
from crain.uma import update_user
user_data = user_data.dict()
user_id = user_data['id']
update_user(user_id, user_data)
return {"message": "DONE"}
JSON payload should look like:
{
"username":"admin",
"id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
"email":null,
"firstName":"admin",
"lastName":"admin",
"createdTimestamp":1638268009973
}
Upvotes: 3
Reputation: 624
in postman switch to raw
data (currently you are in form-data
).
then insert your desired payload:
{
"username":"admin",
"id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
"email":null,
"firstName":"admin",
"lastName":"admin",
"createdTimestamp":1638268009973
}
and fire the request.
BTW, when you say
The endpoint except a dict like this:
user_data = {
"username":"admin",
"id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
"email":null,
"firstName":"admin",
"lastName":"admin",
"createdTimestamp":1638268009973
},
you actually mean the endpoint expect only the dictionary part, because user_data
is simply a variable name in your python code, completely unrelated to any request configuration.
the reason i specify it is because you wrote it as a key
you the postman's request form-data
(the picture you uploaded)
Upvotes: 2