Выбор ответа Middle REST API и OpenAPI спрашивают часто обновлено

Повтор создания платежа

Вопрос

Мобильное приложение отправило POST /payments, сеть оборвалась, ответ не пришёл. Приложение повторяет запрос. Как не списать деньги дважды?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Клиент шлёт Idempotency-Key, и на повтор сервер отдаёт результат первого запроса. Ключ идемпотентности генерирует клиент один раз на операцию, сервер запоминает его и результат.

Варианты ответа

  1. Проверять на сервере, не было ли платежа с той же суммой за последнюю минуту
  2. Клиент шлёт Idempotency-Key, и на повтор сервер отдаёт результат первого запросаправильный ответ
  3. Заменить POST на GET с параметрами платежа: GET идемпотентен по стандарту
  4. Запретить повторы в приложении и показывать ошибку при обрыве сети

Разбор

Ключ идемпотентности генерирует клиент один раз на операцию, сервер запоминает его и результат. Повтор с тем же ключом не создаёт новый платёж. GET для изменения состояния использовать нельзя. Запрет повторов оставит пользователя без ответа при сбоях. Поиск по сумме и времени ошибётся при двух честных одинаковых покупках.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.