Понимание ответов в FastAPI
Ответы являются неотъемлемой частью жизненного цикла API. Ответы — это данные, полученные при взаимодействии с маршрутом API с помощью любого из стандартных методов HTTP. Ответ API обычно предоставляется в формате JSON или XML, но также может быть в форме документа. FastAPI отправляет JSON-ответ клиенту по умолчанию. Ответ состоит из заголовка и тела.
Заголовок ответа состоит из статуса запроса и дополнительной информации, необходимой для доставки тела ответа. Примером информации, содержащейся в заголовке ответа, является Content-Type, который сообщает клиенту возвращаемый тип содержимого.
content-length: 18
content-type: application/json
date: Fri,26 Jan 2024 06:18:33 GMT
server: uvicorn
Тело ответа, с другой стороны, представляет собой данные, запрошенные клиентом с сервера. Тело ответа определяется из переменной заголовка Content-Type наиболее часто используемой является application/json. В предыдущем разделе возвращаемое сообщение об успешном создании записи был телом ответа.
"Message created!"
Коды состояния
Коды состояния — это уникальные короткие коды, выдаваемые сервером в ответ на запрос клиента. Коды состояния ответа сгруппированы в пять категорий, каждая из которых обозначает отдельный ответ:
- 1XX: Запрос получен.
- 2XX: Запрос выполнен успешно.
- 3XX: Запрос перенаправлен.
- 4XX: Ошибка клиента.
- 5XX: Ошибка сервера.
Полный список кодов состояния HTTP мы рассмотрели в разделе "Коды состояний HTTP" данного курса.
Первая цифра кода состояния определяет его категорию. Общие коды состояния включают 200 для успешного запроса, 404 для запроса, не найденного и 500 указывающего на внутреннюю ошибку сервера.
Стандартная практика создания веб-приложений, независимо от платформы, заключается в возврате соответствующих кодов состояния для отдельных событий. Код состояния 400 не должен возвращаться в случае ошибки сервера. Точно так же код состояния 200 не должен возвращаться для неудачной операции запроса.
Построение моделей ответа
В предыдущем разделе мы узнали, как создавать модели с помощью Pydantic. Модели ответа также построены на Pydantic, но служат для другой цели. В определении путей маршрута мы имеем следующий код:
@app.get("/")
async def get_all_messages() -> dict:
return {'Messages': messages_db}
Маршрут возвращает список из записей, присутствующих в базе данных(нашем списке messages_db). Например:
{
"Messages": [
{
"id": 0,
"text": "Simple message"
},
{
"id": 1,
"text": "Simple message"
},
{
"id": 2,
"text": "Simple message"
}
]
}
В данном случае мы возвращаем словарь, но мы можем изменить вывод возвращаемой информации используя аннотации типов и получать уже возвращаемую информацию в виде объектов модели Message:
from typing import List
@app.get("/")
async def get_all_messages() -> List[Message]:
return messages_db
Данная функция GET запроса, возвращает записи, которые хранятся в виде моделей Message.
[
{
"id": 0,
"text": "Simple message"
},
{
"id": 1,
"text": "Simple message"
},
{
"id": 2,
"text": "Simple message"
}
]
Также мы можем добавить валидацию вывода через модели и у функции, которая возвращает одну запись:
@app.get(path="/message/{message_id}")
async def get_message(message_id: int) -> Message:
return messages_db[message_id]
И теперь при получении одной записи, мы будем получать ее в виде объекта модели Message.
FastAPI будет использовать проверку типов данных при их возврате. Если данные недействительны (например, у нас отсутствует поле), это означает, что код нашего приложения не работает и не возвращает то, что должен. Таким образом, мы можем быть уверены, что получаем данные в ожидаемой форме данных.
Теперь, когда мы узнали что такое модели ответов и как их использовать, мы продолжим использовать их там, где они подходят, в последующих разделах курса. Давайте в следующем шаге рассмотрим ответы на ошибки и способы обработки ошибок.