Выбор ответа Middle REST API и OpenAPI спрашивают часто обновлено
Повтор создания платежа
Вопрос
Мобильное приложение отправило POST /payments, сеть оборвалась, ответ не пришёл. Приложение повторяет запрос. Как не списать деньги дважды?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Клиент шлёт Idempotency-Key, и на повтор сервер отдаёт результат первого запроса. Ключ идемпотентности генерирует клиент один раз на операцию, сервер запоминает его и результат.
Варианты ответа
- Проверять на сервере, не было ли платежа с той же суммой за последнюю минуту
- Клиент шлёт Idempotency-Key, и на повтор сервер отдаёт результат первого запросаправильный ответ
- Заменить POST на GET с параметрами платежа: GET идемпотентен по стандарту
- Запретить повторы в приложении и показывать ошибку при обрыве сети
Разбор
Ключ идемпотентности генерирует клиент один раз на операцию, сервер запоминает его и результат. Повтор с тем же ключом не создаёт новый платёж. GET для изменения состояния использовать нельзя. Запрет повторов оставит пользователя без ответа при сбоях. Поиск по сумме и времени ошибётся при двух честных одинаковых покупках.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.