Ответ
Метод HTTP POST не является идемпотентным. Его многократная отправка с одинаковыми данными обычно приводит к созданию нескольких ресурсов (дублированию), так как семантика POST — «создать новый ресурс».
Пример:
POST /api/users HTTP/1.1
Content-Type: application/json
{"name": "John", "email": "john@example.com"}
Каждый такой запрос, скорее всего, создаст нового пользователя с новым уникальным id, но одинаковыми name и email.
Потенциальные проблемы:
- Дублирование данных в системе, нарушение целостности.
- Критические побочные эффекты, если POST выполняет бизнес-действие (например, списание денег, отправка письма). Деньги спишутся несколько раз.
- Увеличение нагрузки на сервер и базу данных.
Способы защиты/управления:
- Идемпотентные ключи (Idempotency-Key): Клиент отправляет уникальный ключ в заголовке. Сервер запоминает результат первой обработки и для повторных запросов с тем же ключом возвращает сохраненный ответ, не выполняя действие снова.
- Проверка дублей на стороне сервера: Например, перед созданием пользователя проверять, существует ли уже запись с таким email.
- Паттерн POST-Redirect-GET: После успешного POST сервер возвращает статус
303 See Otherи ссылку на созданный ресурс (Location: /api/users/123), что помогает избежать повторной отправки при обновлении страницы браузером.