FastAPI - Parameters (POST Requests)
Request Body
Request body is used to send data to the server. Therefore it is a POST method. Under the hood, FastAPI uses Pydantic to validate and convert the data from JSON (incoming request) to BaseModel.
class ItemModel(BaseModel):
name: str
price: float
is_available: Optional[bool] = None
@router.post("/new/")
# in the docs UI, the request body will be shown as a JSON
# with parameters name, price and is_available shown inside request body
def create_item(item: ItemModel):
# the response will be shown as a JSON inside the response body
return item
Path & Query Parameters
Combines all 3 parameters: dataModel, path and query parameters.
@router.post("/items/{item_id}")
def read_item(item: ItemModel, item_id: int, q: Optional[str] = None):
return {"id": item_id,
"item": item,
"q": q}
Parameter Metadata
We can add metadata to the parameters. This metadata will be shown in the docs UI. This is done using the Query
, Path
and Body
classes.
from fastapi import Query, Path, Body
@router.post("/new/{item_id}/comments/")
def create_comment(item: ItemModel, item_id: int, comment_id: int = Query(None, title="Comment ID", description="The ID of the comment to create", alias="commentId", deprecated=False)):
# do something
Validators
We can add validators to the parameters. It validates data passed to parameters. This can be done either by providing a default value. Example: comment_content: str = Body('This is a comment')
.
To specify a mandatory parameter, we can use ...
instead of a default value. Example: comment_content: str = Body(...)
. The ...
means that the parameter is mandatory and it is called a Ellipsis
. You can also use Body(Ellipsis)
instead of Body(...)
.
Other types of validators available are min_length
, max_length
, gt
, lt
, ge
, le
, regex
, email
, url
, etc.