Выбор ответа Middle Проектирование API обновлено

Двойное списание при повторе

Вопрос

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

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

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

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

Коротко

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

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

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

Разбор

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

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

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