Допустимо ли использовать HTTP-метод PUT для обновления нескольких ресурсов одним запросом

«Допустимо ли использовать HTTP-метод PUT для обновления нескольких ресурсов одним запросом» — вопрос из категории Сети, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Технически это возможно реализовать, но это считается антипаттерном и нарушением семантики REST API.

Почему это плохая практика:

Метод PUT предназначен для полной замены ресурса по конкретному, известному URI. Он должен быть идемпотентным, то есть многократное выполнение одного и того же запроса должно приводить к одному и тому же состоянию ресурса.

При попытке обновить несколько ресурсов одним PUT-запросом возникают проблемы:

  1. Нарушение семантики: PUT работает с одним ресурсом. Например, PUT /users/123 заменяет пользователя с ID 123. Какой URI использовать для замены и пользователя, и продукта одновременно? PUT /batch-update семантически некорректен.
  2. Потеря идемпотентности: Если часть операции (например, обновление пользователя) пройдет успешно, а другая (обновление продукта) — нет, повторный запрос приведет к другому результату, нарушая принцип идемпотентности.
  3. Сложность обработки ошибок: Атомарность операции становится проблемой. Если один из объектов не удалось обновить, нужно ли откатывать остальные изменения?

Неправильный пример (как делать не надо):

# Этот запрос семантически неверен для PUT
PUT /api/resources
Content-Type: application/json

{
  "user": {"id": 1, "name": "Alice", "email": "alice@example.com"},
  "product": {"id": 42, "name": "Laptop", "price": 1200}
}

Рекомендация:

Для массовых или пакетных операций всегда используйте метод POST. Он специально предназначен для сценариев, которые не укладываются в простую CRUD-модель (GET, PUT, DELETE).