Каковы последствия многократной отправки POST-запроса?

«Каковы последствия многократной отправки POST-запроса?» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод HTTP POST не является идемпотентным. Его многократная отправка с одинаковыми данными обычно приводит к созданию нескольких ресурсов (дублированию), так как семантика POST — «создать новый ресурс».

Пример:

POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "John", "email": "john@example.com"}

Каждый такой запрос, скорее всего, создаст нового пользователя с новым уникальным id, но одинаковыми name и email.

Потенциальные проблемы:

  1. Дублирование данных в системе, нарушение целостности.
  2. Критические побочные эффекты, если POST выполняет бизнес-действие (например, списание денег, отправка письма). Деньги спишутся несколько раз.
  3. Увеличение нагрузки на сервер и базу данных.

Способы защиты/управления:

  • Идемпотентные ключи (Idempotency-Key): Клиент отправляет уникальный ключ в заголовке. Сервер запоминает результат первой обработки и для повторных запросов с тем же ключом возвращает сохраненный ответ, не выполняя действие снова.
  • Проверка дублей на стороне сервера: Например, перед созданием пользователя проверять, существует ли уже запись с таким email.
  • Паттерн POST-Redirect-GET: После успешного POST сервер возвращает статус 303 See Other и ссылку на созданный ресурс (Location: /api/users/123), что помогает избежать повторной отправки при обновлении страницы браузером.