Идемпотентность и как её проверить
Вопрос
Что такое идемпотентность в HTTP и как бы ты проверил её на реальном API?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Повтор запроса оставляет сервер в том же состоянии, что и один запрос
GET, PUT, DELETE идемпотентны по стандарту, POST нет, PATCH зависит от реализации
Ответ при повторе может отличаться (DELETE: 204, потом 404), важно состояние
Проверка: отправить запрос дважды и сравнить данные в БД или через GET
Для POST оплат и заказов: ключ идемпотентности (Idempotency-Key), повтор с тем же ключом не создаёт дубль
Что могут спросить следом
- Почему PATCH может быть не идемпотентным?
- Что сервер должен ответить на тот же ключ с другим телом?
- Как сеть порождает повторы, если пользователь нажал один раз?
Разбор
Идемпотентность значит, что N одинаковых запросов дают то же состояние сервера, что один. По стандарту идемпотентны GET, HEAD, PUT, DELETE, а POST нет. PATCH зависит от тела: «поставь phone» идемпотентен, «увеличь счётчик на 1» нет. При этом ответ может отличаться: первый DELETE даёт 204, второй 404, но ресурс в обоих случаях удалён. Проверяю так: шлю запрос два раза подряд и смотрю не на ответ, а на данные, через GET или прямо в базе. Отдельно проверяю повторы POST, которые порождает сама сеть: таймаут клиента, ретрай в мобильном приложении, двойной клик. Для платежей нормальная защита это заголовок Idempotency-Key: тот же ключ возвращает тот же результат без второго списания, а тот же ключ с другим телом должен давать ошибку, например 422 или 409.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.