Какие HTTP-методы являются идемпотентными и что это значит?

Ответ

Идемпотентность 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 — это как красная кнопка, жми осторожно, а то насоздаёшь хуйни.