Ответ
Идемпотентность — это свойство 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 — те ещё шлюхи, с ними осторожнее, а то насоздаёшь такого, что потом разгребай.