3.3 Модели ответов и обработка ошибок
5 из 5 шагов пройдено
3 из 3 баллов  получено

Понимание ответов в 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 будет использовать проверку типов данных при их возврате. Если данные недействительны (например, у нас отсутствует поле), это означает, что код нашего приложения не работает и не возвращает то, что должен. Таким образом, мы можем быть уверены, что получаем данные в ожидаемой форме данных.

Теперь, когда мы узнали что такое модели ответов и как их использовать, мы продолжим использовать их там, где они подходят, в последующих разделах курса. Давайте в следующем шаге рассмотрим ответы на ошибки и способы обработки ошибок.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.