Получить доступ

Какие HTTP-методы идемпотентны?

MiddleПроектирование API
Ещё спрашивают так:
  • Что такое идемпотентный метод HTTP?
  • Чем безопасный метод отличается от идемпотентного?
Коротко

Идемпотентны GET, HEAD, OPTIONS, PUT, DELETE: повтор запроса оставляет сервер в том же состоянии. POST и обычно PATCH — нет.

  • Идемпотентность — про состояние сервера, а не про одинаковый ответ: второй DELETE вернёт 404
  • Безопасные (не меняют состояние): GET, HEAD, OPTIONS
  • Идемпотентные запросы клиенты, прокси и браузеры могут повторять сами

А ещё Для POST — ключ идемпотентности

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Идемпотентность — свойство, при котором многократное выполнение запроса даёт тот же эффект на сервере, что и однократное. Ответы при этом могут различаться: первый DELETE /orders/5 вернёт 204, второй — 404, но заказ удалён и после одного, и после двух вызовов.

По спецификации HTTP:

  • безопасные методы — GET, HEAD, OPTIONS — не должны менять состояние вообще; они автоматически идемпотентны;
  • PUT — «положить ресурс целиком в это состояние» — идемпотентен;
  • DELETE — идемпотентен;
  • POST — «обработать» или «создать» — не идемпотентен: два запроса создают два ресурса;
  • PATCH — не гарантирует: «установить поле» идемпотентно, «прибавить к счётчику» — нет.

Почему это важно: сеть ненадёжна, и клиент, не получив ответа, не знает, выполнился ли запрос. Идемпотентные запросы можно безопасно повторить — так делают HTTP-клиенты с повторами, балансировщики и прокси. Браузер предупреждает о повторной отправке формы именно потому, что POST — не идемпотентен.

Проектирование API: не менять состояние в GET (иначе краулер или предзагрузка удалят данные); для создания — POST с ключом идемпотентности или PUT с идентификатором от клиента.

Что хотят услышать

  • Список идемпотентных и неидемпотентных методов.
  • Определение через состояние сервера, пример с DELETE.
  • Различие безопасных и идемпотентных.
  • Практический смысл: безопасные повторы, ключ идемпотентности для POST.

Частые ошибки

  • Считать DELETE неидемпотентным из-за разных ответов.
  • Менять состояние в GET.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓GET
  • ✓PUT
  • ✓DELETE
  • ✗POST

Что спросят дальше

  • Как сделать создание ресурса безопасным при повторе?
  • Чем 409 отличается от 422?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем