tools
Повторные запросы: как проверить, что не появился дубль
Около 6 мин чтения
Нажали «Отправить», увидели ошибку связи, нажали ещё раз. В списке две одинаковые заявки. Пользователь хотел одну, а система создала две.
Чтобы разобраться, нужно различать действие на сервере и доставку ответа в браузер. Сервер мог сохранить заявку, а ответ потерялся уже после этого.
Три разных результата сбоя
После сетевой ошибки возможны разные ситуации:
- Запрос не дошёл до сервера, ничего не создано.
- Сервер получил запрос, но не завершил обработку.
- Сервер создал объект, но браузер не получил подтверждение.
Одна надпись «Ошибка сети» не позволяет выбрать вариант. Поэтому перед повторной отправкой важен способ узнать результат исходного действия.
Повтор и новая операция
В некоторых API у действия есть уникальный идентификатор. Повтор с тем же идентификатором означает: «Я всё ещё спрашиваю про эту заявку». Новый идентификатор может означать новое намерение.
Идемпотентность в этом контексте: оговорённые повторы не добавляют новые последствия. Это не обещание, что все ответы будут одинаковыми во всех системах. Какие запросы разрешено повторять, как долго помнится ключ и что бывает при изменении полей, нужно читать в контракте API.
Например, сервис обещает: одинаковые ID операции и поля возвращают исходную заявку. Тогда повтор должен вернуть прежний номер и оставить одну запись. Если отправить новый ID, это уже другая проверка.