Sobes.tech
Назад к вопросам
Junior — Middle
68

Какие HTTP-методы обеспечивают идемпотентность при повторных запросах?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Идемпотентными обычно считают GET, PUT, DELETE, HEAD, OPTIONS и TRACE. Это значит, что повторный вызов одного и того же запроса не должен менять результат после первого применения. На собеседовании важно также сказать, что идемпотентность относится к эффекту на сервере, а не к тому, что ответы всегда будут одинаковыми по телу.

Определение:

Идемпотентный HTTP-метод — это метод, повторение которого с теми же параметрами не приводит к дополнительному изменению состояния ресурса. Если запрос выполнить один раз или несколько раз подряд, итоговое состояние системы должно быть одинаковым.

Чаще всего:

  • GET — только читает данные;
  • PUT — заменяет ресурс целиком;
  • DELETE — удаляет ресурс, и повторное удаление обычно не меняет состояние;
  • HEAD — как GET, но без тела ответа;
  • OPTIONS — запрашивает доступные возможности;
  • TRACE — диагностический метод, также считается идемпотентным.

Неидемпотентный метод — это обычно POST, потому что повторный запрос может создавать новые сущности или запускать повторные действия.

Пример использования:

Например, в API корзины:

  • GET /orders/123 — можно вызывать сколько угодно раз, заказ не изменится;
  • PUT /orders/123 с одинаковым телом — каждый раз установит одно и то же состояние заказа;
  • DELETE /orders/123 — удалит заказ, и повторный вызов не должен «удалить еще раз» что-то новое;
  • POST /orders — может создать новый заказ при каждом повторе.
GET /users/42
PUT /users/42
DELETE /users/42
POST /users

Пояснение кода:

Код не требуется. На примере HTTP-запросов это можно разобрать так:

  1. GET /users/42 — сервер возвращает данные пользователя, состояние ресурса не меняется.
  2. PUT /users/42 с телом { "name": "Ivan" } — сервер записывает это состояние; повторный такой же PUT не меняет результат.
  3. DELETE /users/42 — пользователь удаляется; повторный DELETE не должен создавать новый объект или менять состояние дополнительно.
  4. POST /users — если повторить запрос, сервер может создать две записи, поэтому метод не идемпотентен.

Ключевые моменты:

  • Идемпотентность — это свойство повторных запросов не менять итоговое состояние после первого применения.
  • Обычно идемпотентны GET, PUT, DELETE, HEAD, OPTIONS, TRACE.
  • POST обычно неидемпотентен, потому что может создавать новые сущности или запускать повторные операции.
  • Идемпотентность не означает одинаковый ответ при каждом вызове; важен одинаковый эффект на сервере.
  • PUT чаще идемпотентен, чем POST, потому что задает ресурс в фиксированное состояние.
  • В реальных системах реализация может нарушать ожидаемую идемпотентность, если сервер логически обрабатывает повторный запрос как новое действие.