Ответ
Идемпотентность HTTP-метода означает, что повторный идентичный запрос к серверу будет приводить к тому же состоянию ресурса, что и первоначальный. Другими словами, сколько бы раз вы ни отправили такой запрос, результат будет один и тот же.
Это критически важно для построения надёжных систем: если клиент не получил ответ (например, из-за сбоя сети), он может безопасно повторить идемпотентный запрос.
Идемпотентные методы:
GET: Запрашивает представление ресурса. Не изменяет состояние.HEAD: АналогиченGET, но без тела ответа. Не изменяет состояние.PUT: Полностью заменяет ресурс по указанному URI. Если ресурс существует, он заменяется; если нет — создаётся. Повторные вызовы с теми же данными дадут тот же результат.DELETE: Удаляет ресурс. Первый запрос удалит ресурс (и вернёт200 OKили204 No Content), а последующие, скорее всего, вернут404 Not Found. Состояние сервера остаётся неизменным после первого успешного удаления.OPTIONS: Запрашивает информацию о параметрах соединения для ресурса.
Неидемпотентные методы:
POST: Обычно используется для создания нового дочернего ресурса. Каждый успешный запросPOSTсоздаёт новый, уникальный ресурс.- Пример:
POST /usersсоздаст нового пользователя при каждом вызове.
- Пример:
PATCH: Вносит частичные изменения в ресурс. Его идемпотентность зависит от операции. Например,PATCH /articles/1 { "views": views + 1 }неидемпотентен, аPATCH /articles/1 { "status": "published" }— идемпотентен.
Ответ 18+ 🔞
Так, слушай, про идемпотентность в HTTP. Это, блядь, такая штука, чтобы твой запрос можно было тыкать как попугая — хоть сто раз, а хуйня одна и та же будет. Понимаешь? Если сеть глюкнула и ты не понял, дошло или нет, просто пиздуй его ещё раз. С идемпотентным методом ничего страшного не случится, ресурс останется в том же состоянии, как будто ты его один раз тронул.
Это, сука, основа для систем, которые не развалятся от чиха. Без этого — пиздец и мрак.
Вот методы, которые можно долбить сколько влезет (идемпотентные):
GET: Просто посмотреть, нихуя не трогая. Как в музее: смотри, но руками не еби.HEAD: То же самое, чтоGET, но тебе даже картинку не покажут, только заголовки. Экономия, блядь, трафика.PUT: Этим методом ты говоришь: «На, сука, вот тебе новый ресурс, засунь его по этому адресу». Если там что-то было — затрется, если пусто — создастся. Повторишь с теми же данными — нихуя не изменится, всё так и останется лежать.DELETE: Удалить. Первый раз удалит и скажет «ок». Второй раз придешь — ресурса уже нет, получишь «404 не найдено». Но состояние-то системы не меняется! После первого удаления всё, пиши пропало. Так что формально — идемпотентный.OPTIONS: Спросить у сервера: «А на что ты вообще способен?». Просто запрос информации, нихуя не ломает.
А вот эти, блядь, штуки — опасные, неидемпотентные (тыкать больше раза — рискованно):
POST: Это, сука, фабрика по производству сущностей. Каждый раз, как нажал — родится новый объект. ОтправилPOST /users— создался Вася. Отправил ещё раз — создался Петя. И так до овердохуища одинаковых пользователей, если не контролировать.PATCH: А вот это хитрая жопа. Он может быть как идемпотентным, так и нет — смотри по операции. Если пишешьPATCH /articles/1 { "views": views + 1 }— это, блядь, инкремент, каждый запрос число увеличит. Неидемпотентность пиздец! А еслиPATCH /articles/1 { "status": "published" }— то сколько ни шлифуй, статус будет «опубликовано». Вот тут уже идемпотентность.
Короче, запомни: GET, HEAD, PUT, DELETE, OPTIONS — можно слать повторно без зазрения совести. А POST и иногда PATCH — это как красная кнопка, жми осторожно, а то насоздаёшь хуйни.