Какие из HTTP-методов POST, PUT и PATCH являются идемпотентными

Ответ

Идемпотентным является HTTP-метод, многократное повторение которого приводит к тому же результату, что и однократное выполнение. Среди перечисленных методов PUT является идемпотентным, POST — нет, а PATCH может быть, но не гарантированно.

PUT

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

Пример:

# Первый запрос создает или обновляет пользователя
PUT /api/users/123
Content-Type: application/json

{ "name": "Alice", "email": "alice@example.com" }

# Повторный запрос приведет к тому же состоянию ресурса
PUT /api/users/123
Content-Type: application/json

{ "name": "Alice", "email": "alice@example.com" }

POST

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

PATCH

Условно идемпотентный. Метод PATCH применяет частичные изменения к ресурсу. Его идемпотентность зависит от выполняемой операции.

  • Идемпотентная операция: Установка конкретного значения поля.
    // Установить статус "published". Повторные запросы не изменят результат.
    { "op": "replace", "path": "/status", "value": "published" }
  • Неидемпотентная операция: Инкремент значения.
    // Увеличить счетчик просмотров. Каждый запрос изменит состояние.
    { "op": "add", "path": "/views", "value": 1 }

Ответ 18+ 🔞

А, ну вот, опять про эту вашу идемпотентность, блядь! Слушай, да это ж проще пареной репы, если не загоняться в дебри. Сейчас на пальцах, как для дебила, объясню.

Представь, что у тебя есть кнопка. Нажал один раз — лампочка загорелась. Нажал её ещё десять раз — она так и горит, не тухнет и не взрывается. Вот это и есть идемпотентность, ёпта! Результат от одного пиздюка и от сотни — одинаковый. А теперь смотри, как это в HTTP-методах работает.

PUT — это как раз та самая кнопка, сука. Идемпотентный, блядь, на все сто. Что он делает? Он говорит: «Слушай, ресурс, вот тебе полный набор новых данных. Забудь, что было, и стань вот этим». Сделал раз — ресурс стал таким. Сделал сто раз с теми же данными — он так и останется таким же, нихуя не изменится. Просто перезапишет сам себя, как дурак.

PUT /api/users/123
Content-Type: application/json

{ "name": "Alice", "email": "alice@example.com" }

Отправил этот запрос — Алиса появилась. Отправил его ещё раз, блядь, хоть тысячу — Алиса никуда не денется, не размножится, просто будет сидеть там, на месте 123, и всё. Идемпотентность, мать её!

А вот POST — это полная его противоположность, хитрая жопа. Не идемпотентный, блядь, ни разу. Это как кнопка «роди ребёнка». Нажал раз — родился один. Нажал второй — родился второй. Десятый раз нажал — у тебя уже детский сад на шее, и все орут. Каждый новый запрос создаёт новую сущность, новый ресурс. Повторение — мать ебаного наказания, а не идемпотентности.

Ну и подъехал наш капитан очевидность — PATCH. А вот тут, сука, интересно! Он как швейцарский нож: может быть идемпотентным, а может и не быть. Всё зависит от того, какую операцию ты им делаешь.

  • Если операция идемпотентная: Ну, типа, «поставь статус "опубликовано"». Сделал раз — стоит «опубликовано». Сделал ещё пять раз — оно так и стоит «опубликовано», не «супер-пупер-опубликовано». Всё ок.

    { "op": "replace", "path": "/status", "value": "published" }
  • А если неидемпотентная: Вот тут пиздец начинается. Типа «добавь единичку к счётчику просмотров». Ёбнул запрос раз — счётчик стал 1. Ёбнул второй — уже 2. Десятый раз ёбнул — овердохуища просмотров накрутил. Состояние-то меняется каждый раз!

    { "op": "add", "path": "/views", "value": 1 }

Так что с PATCH'ем, чувак, надо ебать как осторожно. Смотри в оба, что там в теле запроса лежит, а то накрутишь себе проблем на ровном месте. В общем, запомни: PUT — надёжный, как швейцарские часы, POST — плодовитый, как кролик, а PATCH — тот ещё подлец, может и подставить.