Что такое идемпотентность HTTP-запроса

Ответ

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

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

Классификация методов

  • Идемпотентные методы:

    • GET, HEAD, OPTIONS, TRACE: Безопасные методы, не изменяют состояние сервера.
    • PUT: Полностью заменяет ресурс. Повторный PUT с теми же данными просто перезапишет ресурс тем же состоянием.
    • DELETE: Удаляет ресурс. Повторный DELETE вернет ошибку (например, 404), но состояние системы (отсутствие ресурса) не изменится.
  • Неидемпотентные методы:

    • POST: Обычно создает новый ресурс. Каждый повторный запрос создаст новую сущность.
    • PATCH: Частично обновляет ресурс. Не является идемпотентным по спецификации, так как результат может зависеть от текущего состояния ресурса (например, инкремент значения).

Пример

# Идемпотентный запрос: сколько раз ни вызывай, пользователь 1 будет иметь имя "Alice"
PUT /users/1 HTTP/1.1
Content-Type: application/json

{ "name": "Alice" }

# Неидемпотентный запрос: каждый вызов создаст нового пользователя
POST /users HTTP/1.1
Content-Type: application/json

{ "name": "Bob" }

Ответ 18+ 🔞

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

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

Какие методы как себя ведут, блядь:

  • Идемпотентные, спокойные:
    GET, HEAD, OPTIONS, TRACE — они вообще безопасные, нихуя не меняют, так что хоть обосрись ими, всё будет как было.
    PUT — он ресурс целиком заменяет. Отправил его второй раз с теми же данными — ну, перезапишет он его на то же самое, состояние-то не поменяется, епта.
    DELETE — удалил ресурс. Отправил его ещё раз — он, конечно, ругнётся, что мол «чё удалять-то, его уже нет», но состояние системы (то есть факт отсутствия) останется тем же. Не появится же он обратно, блядь, от повторного удаления.

  • Неидемпотентные, пакостники:
    POST — он обычно новую хуйню создаёт. Каждый раз, как его вызовешь — новый объект в базе и вылезет. Овердохуища одинаковых записей можно наделать.
    PATCH — он ресурс частично меняет. По спецификации он не идемпотентный, потому что результат зависит от того, в каком состоянии ресурс был до этого. Ну, типа, «увеличить счётчик на 1» — каждый вызов будет делать +1, а не возвращать к одному значению.

Вот, смотри, пример, чтобы совсем ясно стало:

# Идемпотентный запрос: хоть сто раз шли, у пользователя с id=1 будет имя "Alice"
PUT /users/1 HTTP/1.1
Content-Type: application/json

{ "name": "Alice" }

# Неидемпотентный запрос: каждый чих — новый Bob в базе. Пидарасы налетели!
POST /users HTTP/1.1
Content-Type: application/json

{ "name": "Bob" }

Вот и вся магия, блядь. Главное — запомнить, что PUT и DELETE — ребята предсказуемые, с ними можно. А POST и PATCH — те ещё шлюхи, с ними осторожнее, а то насоздаёшь такого, что потом разгребай.