In FastAPI, you can handle different types of parameters in your endpoints, such as path parameters, query parameters, and request body parameters. Each type of parameter is handled differently depending on how it is defined in the endpoint function.
1. Path Parameters
Path parameters are part of the URL path. They are typically used to pass resources or identifiers that are part of the route, for example, /items/{item_id}
.
Example:
python
@app.put("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
2. Query Parameters
Query parameters are part of the URL after the ?
symbol, and they are used to pass additional data to the request. They are typically used with GET or PUT requests and are defined as function parameters without braces.
Example with a single query parameter:
python
@app.put("/items/")
async def read_item(item_id: int):
return {"item_id": item_id}
To test this with requests
:
python
import requests
url = 'http://127.0.0.1:8009/items/?item_id=5'
res = requests.put(url)
print(res.text) # Output: {"item_id": 5}
3. Request Body Parameters
Request body parameters are used when you need to send structured data as the body of the request. These can be either single or multiple parameters passed as JSON in the request body.
Single Request Body Parameter
To specify that a parameter should be in the request body, you use Body()
.
Example:
python
from fastapi import Body, FastAPI
@app.put("/items/")
async def read_item(item_id: int = Body(...)):
return {"item_id": item_id}
To test with requests
:
python
import requests
url = 'http://127.0.0.1:8009/items/'
res = requests.put(url, json={"item_id": 5})
print(res.text) # Output: {"item_id": 5}
Multiple Request Body Parameters
You can also define multiple parameters in the request body by using Body()
for each one.
Example:
python
from fastapi import Body, FastAPI
@app.put("/items/")
async def read_item(item_id: int = Body(...), name: str = Body(...)):
return {"item_id": item_id, "name": name}
To test with requests
:
python
import requests
url = 'http://127.0.0.1:8009/items/'
res = requests.put(url, json={"item_id": 5, "name": "张三"})
print(res.text) # Output: {"item_id": 5, "name": "张三"}
4. Using Pydantic Models for Request Body
You can also use Pydantic models to define request bodies, which gives you more control and validation over the incoming data.
Example:
python
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.put("/items/")
async def read_item(item: Item):
return {"name": item.name, "price": item.price}
To test with requests
:
python
import requests
url = 'http://127.0.0.1:8009/items/'
data = {"name": "细胞生物学", "description": "考研书籍", "price": 35.8, "tax": 0.6}
res = requests.put(url, json=data)
print(res.text) # Output: {"name": "细胞生物学", "price": 35.8}
5. Mixed Parameters (Path, Query, and Body)
You can also mix path, query, and body parameters in a single endpoint. FastAPI will automatically handle them correctly.
Example:
python
from fastapi import Body, FastAPI
@app.put("/items/{name}")
async def read_item(name: str, age: int, item_id: int = Body(...)):
return {"name": name, "age": age, "item_id": item_id}
Testing via FastAPI's Documentation
FastAPI also provides a built-in interactive docs interface at /docs
that allows you to test all your endpoints directly in the browser. You can input values for query parameters, request body parameters, and see the results.
To access the docs:
- Run the FastAPI app.
- Open
http://127.0.0.1:8009/docs
in a browser. - Test your endpoints using the interactive interface by clicking on "Try it out", filling in the parameters, and clicking "Execute".