Механизм для обеспечения возможности многократности вызова запроса с гарантией того, что состояние системы изменится единожды. В REST API это свойство гарантирует, что многократное выполнение операции с теми же параметрами даёт результат, аналогичный его однократному выполнению.

В рамках протокола HTTP идемпотентными являются глаголы GET, PUT, DELETE. Метод POST неидемпотентен, поскольку предполагает создание нового ресурса на сервере. Также неидемпотентным считается глагол PATCH (согласно RFC 5789) засчёт своей природы (частичное обновление ресурса, в рамках такой операции у ресурса могут увеличиваться счётчики или добавляться значение в коллекцию данных), хотя этому методу можно обеспечить данное свойство благодаря особенностям реализации.

Если рассмотреть каждый HTTP Verb отдельно:

  • POST — неидемпотентен, создаёт новый ресурс;
  • GET — идемпотентен, получение данных, не изменяет состояние системы;
  • PUT — идемпотентен, обновление ресурса целиком;
  • PATCH — изначально неидемпотентен, частичное обновление ресурса, может стать таковым через детали реализации;
  • DELETE — идемпотентен, удаление ресурса.

Кеширование

Идемпотентные операции можно кешировать, поскольку результаты таких операций предсказуемы.

Может ли системный вызов быть идемпотентным?