Является ли HTTP-метод DELETE идемпотентным?

Ответ

Да, HTTP-метод DELETE считается идемпотентным согласно спецификации RFC 7231, но с важным уточнением.

Идемпотентность означает, что многократное выполнение одного и того же запроса приводит к одинаковому состоянию системы, как и после первого выполнения.

Почему DELETE идемпотентен:

  • Запрос DELETE /api/users/123 удаляет ресурс с ID 123.
  • Первый вызов возвращает статус 200 OK (или 204 No Content).
  • Последующие вызовы к тому же ресурсу обычно возвращают 404 Not Found, но конечное состояние системы (отсутствие ресурса) остаётся неизменным.

Пример неидемпотентного поведения (нарушение контракта):

DELETE /api/users/last

Каждый запрос удаляет "последнего пользователя", который может быть разным, изменяя состояние системы новым способом. Такой дизайн эндпоинта нарушает принцип идемпотентности.

Практическое правило для REST API:

  • DELETE, применяемый к конкретному ресурсу (по ID), — идемпотентен.
  • DELETE, применяемый к коллекции или выполняющий операцию "последний", — может не быть идемпотентным.

Ответ 18+ 🔞

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

Так вот, блядь, этот самый DELETE — он вроде как идемпотентный, да. По бумажкам, по этим вашим RFCшным, всё чинно-благородно. Но тут, как всегда, есть своя хитрая жопа, которую надо понимать, а не просто в рот брать и глотать.

Идемпотентность, ёпта, это когда ты десять раз подряд на одну и ту же кнопку нажал, а в итоге получил один и тот же пиздец. Не десять разных пиздецов, а один. Понимаешь?

Смотри, как с DELETE работает: Ты шлёшь запрос DELETE /api/users/123. Бах! Пользователь с айдишником 123 — кердык. Сервер тебе: «Окей, братан, всё, нет его» (200 OK). А ты, мудак, не уверенный, опять шлёшь тот же запрос. Сервер смотрит: «А нахуя? Его же уже нет, ёбта». И шлёт тебе 404 Not Found. Но состояние-то системы, блядь, не изменилось! Пользователя как не было после первого раза, так и нет. Всё, как после первого пиздюка. Это и есть идемпотентность, ебать мои старые костыли! Результат тот же.

А теперь смотри, где можно наебнуться, как дурак: Вот смотри на этот код, он остаётся как есть, я его не трогаю:

DELETE /api/users/last

Вот это уже, сука, не идемпотентно! Почему? А потому что «последний» — это кто? Сегодня это Вася, завтра — Петя. Первый запрос удалит Васю. Второй запрос, блядь, удалит уже Петю, который стал «последним» после удаления Васи. Состояние системы меняется каждый раз по-новому! Это уже не идемпотентность, а пиздопроебибна какая-то. Такой эндпоинт — говно, а не REST.

Короче, запомни раз и нахуй:

  • DELETE по конкретной хуйне (по ID) — да, идемпотентный, всё ок.
  • DELETE по какой-то хуйне плавающей (типа «последний», «самый старый») — нет, блядь, не идемпотентный, и ты пидор, если так делаешь.

Вот и вся магия, ебушки-воробушки. Главное — головой думай, а не жопой.