JavaRush /Курсы /Модуль 4: FastAPI /Обработка POST-запросов: отправка данных

Обработка POST-запросов: отправка данных

Модуль 4: FastAPI
2 уровень , 2 лекция
Открыта

POST-запросы используются для передачи данных на сервер. Этот метод обычно применяется для создания новых ресурсов, например, добавления записи в базу данных. В отличие от GET-запросов, которые передают данные в URL, POST отправляет данные в теле запроса, что делает его подходящим для передачи более сложных структур.


Пример базового POST-запроса

Начнем с создания простого эндпоинта, который принимает данные в теле запроса.


from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# Определяем модель данных
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool

# Эндпоинт для обработки POST-запросов
@app.post("/items/")
async def create_item(item: Item):
    return {
        "message": "Item has been created!",
        "item": item
    }

Теперь, если вы запустите сервер с помощью uvicorn main:app --reload и отправите POST-запрос на /items/, передав JSON-данные, сервер вернет нам эти данные обратно с сообщением. Попробуйте это сделать через Swagger UI (доступно по адресу http://127.0.0.1:8000/docs) или с помощью инструмента вроде Postman.

Например:


POST /items/
{
    "name": "Laptop",
    "price": 799.99,
    "is_offer": true
}

Ответ:


{
    "message": "Item has been created!",
    "item": {
        "name": "Laptop",
        "price": 799.99,
        "is_offer": true
    }
}

Как передавать данные в POST-запросах

FastAPI использует модели данных Pydantic для валидации и сериализации данных. Это делает передачу и обработку данных невероятно удобной и безопасной.

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

Добавление дефолтных значений и проверка типов

В Pydantic вы можете задавать значения по умолчанию и проводить базовую валидацию данных. Например:


class Item(BaseModel):
    name: str
    price: float = 0.0  # Значение по умолчанию
    is_offer: bool = False

Теперь, если клиент забудет передать price или is_offer, он все равно получит корректный ответ, так как значения будут заполнены автоматически.

Попробуем отправить следующий запрос:


POST /items/
{
    "name": "Smartphone"
}

Ответ:


{
    "message": "Item has been created!",
    "item": {
        "name": "Smartphone",
        "price": 0.0,
        "is_offer": false
    }
}

Валидация и обработка данных

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

Пример более сложной модели

Допустим, мы хотим, чтобы название товара было длиной не менее 3 символов, а цена — строго положительное число.


from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str = Field(min_length=3, max_length=50)
    price: float = Field(gt=0)  # Цена должна быть больше 0
    is_offer: bool = Field(default=False)

Теперь, если кто-то попробует отправить данные с некорректным названием или отрицательной ценой, FastAPI автоматически вернет ошибку:


POST /items/
{
    "name": "12",
    "price": -10.5,
    "is_offer": true
}

Ответ:


{
    "detail": [
        {
            "loc": ["body", "price"],
            "msg": "ensure this value is greater than 0",
            "type": "value_error.number.not_gt"
        },
        {
            "loc": ["body", "name"],
            "msg": "ensure this value has at least 3 characters",
            "type": "value_error.any_str.min_length"
        }
    ]
}

Обратите внимание, никаких лишних усилий с нашей стороны для создания этой системы проверки не потребовалось. Это делает FastAPI невероятно мощным инструментом.


Обработка нескольких элементов

Иногда вам понадобится обработать массив данных. Например, если клиент передает список товаров для массового добавления.

Пример: массив объектов

Мы можем легко обработать массив с помощью аннотации типов List из модуля typing.

Вот пример:


from typing import List

@app.post("/items/bulk/")
async def create_items(items: List[Item]):
    return {
        "message": f"{len(items)} items have been created!",
        "items": items
    }

Попробуйте отправить такой запрос:


POST /items/bulk/
[
    {
        "name": "Tablet",
        "price": 499.99,
        "is_offer": false
    },
    {
        "name": "Monitor",
        "price": 199.99,
        "is_offer": true
    }
]

Ответ:


{
    "message": "2 items have been created!",
    "items": [
        {
            "name": "Tablet",
            "price": 499.99,
            "is_offer": false
        },
        {
            "name": "Monitor",
            "price": 199.99,
            "is_offer": true
        }
    ]
}

Ну разве не волшебство? FastAPI сам разберет JSON-массив и проверит каждый объект на соответствие модели Item.


Типичные ошибки

Обработка данных может быть капризной, если вы не учли все аспекты. Например, часто забывают:

  1. Указывать правильные типы данных в модели. Если ожидается int, переданный клиентом str вызовет ошибку.
  2. Проверять минимальные и максимальные значения чисел. Никому не нужен товар с ценой -1000000.
  3. Работать с массивами объектов, корректно проверяя каждый элемент. FastAPI сделает это за вас, но только при правильной конфигурации.

Если вы заметили, что ваш API возвращает ошибку 422, скорее всего, проблема в несоответствии данных, передаваемых клиентом, и ожидаемым параметрам модели.


Как это выглядит в реальных проектах

Обработка POST-запросов чаще всего используется для создания новых данных. Пример реального применения:

  • Регистрация нового пользователя (передача имени, почты, пароля).
  • Добавление товаров в интернет-магазине.
  • Сохранение данных формы обратной связи.

FastAPI позволяет быстро разрабатывать такие API, минуя сложность обработки в сыром виде. Это особенно важно для проектов, где время разработки имеет критическое значение.


Вы готовы к следующему шагу! Впереди мы продолжим раскрывать мощь FastAPI, изучая PUT-запросы и обновление данных. Не забудьте закрепить материал, ведь обработка POST — это основа любой системы управления данными.

1
Задача
Модуль 4: FastAPI, 2 уровень, 2 лекция
Недоступна
Создание простого POST-эндпоинта
Создание простого POST-эндпоинта
1
Задача
Модуль 4: FastAPI, 2 уровень, 2 лекция
Недоступна
Валидация данных в POST-запросе
Валидация данных в POST-запросе
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ