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

Ответ

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

Ключевая идея: "N > 0 идентичных запросов = эффект от одного запроса".

Идемпотентные методы (по спецификации HTTP/1.1):

  • GET
  • HEAD
  • PUT
  • DELETE
  • OPTIONS
  • TRACE

Неидемпотентный метод: POST (каждый запрос может создать новый ресурс).

Практические примеры:

PUT /api/users/456 HTTP/1.1
Host: example.com
Content-Type: application/json

{"name": "Alice"}

Повторная отправка этого PUT-запроса не создаст нового пользователя, а будет многократно обновлять одного и того же пользователя с id=456. Это и есть идемпотентность.

DELETE /api/files/789 HTTP/1.1
Host: example.com

Первый вызов DELETE удалит файл и вернет статус 200 OK или 204 No Content. Последующие вызовы того же DELETE часто возвращают 404 Not Found, но состояние сервера (отсутствие файла) не меняется — метод остается идемпотентным.

Важно: Идемпотентность гарантируется на уровне логики приложения. Серверная реализация должна обеспечивать это свойство.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня про идемпотентные методы — это не просто заумь какая-то, а реально важная штука, чтобы твоё приложение не обосралось при первом же глюке сети. Представь: отправил запрос, а ответ потерялся. Что делает любой адекватный клиент? Правильно, шлёт его ещё раз, блядь. А если метод не идемпотентный — пиши пропало, нахуй. Создашь десять одинаковых заказов, пользователь тебе ебальник набьёт.

Суть проще пареной репы: сколько бы раз ты ни тыкал в одну и ту же кнопку с одними и теми же данными — на сервере должно произойти ровно то же самое, что и после одного тыка. N > 0 одинаковых запросов = эффект как от одного. Вот и вся магия, ёпта.

Кто у нас идемпотентный пацан (по канонам HTTP):

  • GET (прочитать)
  • HEAD (прочитать заголовки)
  • PUT (заменить хуйню)
  • DELETE (удалить хуйню)
  • OPTIONS, TRACE (техническая ерунда)

А кто ведёт себя как последняя мартышлюшка и создаёт новый пиздец каждый раз? Это POST, сука. Каждый его вызов — как новый ребёнок у алкаша, не жди ничего хорошего.

Смотри на живых примерах, а то нихуя не понятно:

Вот ты обновляешь пользователя:

PUT /api/users/456 HTTP/1.1
Host: example.com
Content-Type: application/json

{"name": "Alice"}

Отправил раз — Алиса стала Alice. Отправил десять раз из-за того, что мобильный интернет — говно — она всё равно останется Alice, а не превратится в десять разных Алис. Вот она, идемпотентность, мать её.

А вот удаление:

DELETE /api/files/789 HTTP/1.1
Host: example.com

Ткнул раз — файл 789 отправился в цифровое небытие, сервер сказал «ок, нет проблем». Ткнул второй раз, потому что не веришь своим глазам, — сервер уже орёт «чё ты пристал, нету твоего файла, иди нахуй!» (вернёт 404). Но состояние-то системы не изменилось! Файл и так уже был удалён. Метод — идемпотентный, волнение ебать ноль.

Но запомни, чувак: это всё — договорённость, а не волшебство. Если ты на сервере в методе DELETE напишешь хуйню, которая при каждом вызове списывает десять рублей со счета пользователя, то это будет твой личный пиздец, а не проблема HTTP. Гарантию должен обеспечивать ты сам, своей кривой, но верной логикой.