Запросы и ответы FastAPI
В FastAPI запрос и ответ — основа взаимодействия с клиентами.
FastAPI предоставляет мощные инструменты для разбора данных запроса и создания стандартизированных ответов по мере необходимости.

Далее подробно рассмотрим запросы и ответы в FastAPI.
По вопросам, связанным с HTTP, см.:Методы HTTP-запросов。
Данные запроса
Параметр запроса
В следующем примере мы определяем/items/маршрут, который принимает два параметра запроса:skipиlimit, их типы — целые числа, а значения по умолчанию соответственно0и10。
Пример
app = FastAPI()
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
Выполните следующую команду в командной строке, чтобы запустить приложение:
uvicorn main:app --reload
Теперь откройте браузер и перейдите по адресуhttp://127.0.0.1:8000/items/, который возвращает стандартные JSON-данные:

Передайте параметрыGET-запросаhttp://127.0.0.1:8000/items/?skip=1&limit=5, возвращает JSON-данные следующим образом:

Параметр пути
Мы можем задавать параметры в пути, делая URL более эстетически привлекательным.
В следующем примере мы определяем параметр путиitem_idи параметры запросаqмаршрута.
Пример
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Передайте параметрыGET-запросаhttp://127.0.0.1:8000/items/5/?q=example, возвращает JSON-данные следующим образом:

тело запроса
Далее мы создали/items/маршрут, используя@app.postДекоратор указывает, что это обрабатываетPOSTмаршрут запроса.
Пример
from fastapi import FastAPI
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return item
Используйте модель Pydantic Item для определения тела запроса, содержащего несколько полей, некоторые из которых имеют значения по умолчанию. Для более подробного знакомства с Pydantic см.:Модель Pydantic в FastAPI。
Далее мы можем открытьhttp://127.0.0.1:8000/docsчтобы выполнить тест POST:
Заполните параметры запроса:

Возвращаемый результат выглядит следующим образом:

Данные ответа
Возврат данных JSON
Функция-обработчик маршрута возвращает словарь, который FastAPI автоматически преобразует в формат JSON и отправляет клиенту в качестве ответа:
Пример
app = FastAPI()
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/, возвращаются данные JSON:

Возврат модели Pydantic
Функция-обработчик маршрута возвращает экземпляр модели Pydantic. FastAPI автоматически преобразует его в формат JSON и отправляет клиенту в качестве ответа:
Пример
from fastapi import FastAPI
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return item
POST-запрос, возвращаемый формат данных выглядит следующим образом:
{
"name": "example",
"description": "Example POST 测试",
"price": 12,
"tax": 1
}
Заголовки запроса и Cookies
Используйте аннотации типов Header и Cookie для получения данных заголовков запроса и cookie.
Пример
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
return {"User-Agent": user_agent, "Session-Token": session_token}
Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/, возвращаются данные JSON:

Перенаправления и коды состояния
ИспользованиеRedirectResponseРеализуйте перенаправление, перенаправляющее клиента на/items/маршрут.
Пример
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
app = FastAPI()
@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
return {"User-Agent": user_agent, "Session-Token": session_token}
@app.get("/redirect")
def redirect():
return RedirectResponse(url="/items/")
При обращении к приведённому выше коду в браузереhttp://127.0.0.1:8000/redirect/произойдёт автоматическое перенаправление наhttp://127.0.0.1:8000/items/страницу:

Используйте HTTPException для возбуждения исключений и возврата пользовательских кодов состояния и подробной информации.
В следующих примерахitem_idравен42вернёт404Код состояния:
Пример
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id == 42:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id}
Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/42/Страница отображается следующим образом:

Пользовательские заголовки ответа
ИспользованиеJSONResponseПользовательские заголовки ответа:Пример
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
content = {"item_id": item_id}
headers = {"X-Custom-Header": "custom-header-value"}
return JSONResponse(content=content, headers=headers)
Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/42/Страница отображается следующим образом, где мы можем увидеть наши пользовательские заголовки ответа:
