Какие идемпотентные HTTP-методы вы знаете?

Ответ

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

Основные идемпотентные методы:

  • GET: Используется только для получения данных. Многократные вызовы не должны влиять на состояние ресурса.
  • PUT: Полностью заменяет ресурс по указанному URI. Повторный вызов с теми же данными не изменит итоговое состояние системы.
  • DELETE: Удаляет ресурс. После первого успешного вызова ресурс удалён, а последующие вызовы возвращают тот же результат (например, 404 или 410), не изменяя состояние.
  • HEAD: Аналогичен GET, но сервер возвращает только заголовки ответа без тела.

Пример идемпотентного PUT в Node.js (Express):

app.put('/api/users/:id', async (req, res) => {
  const { id } = req.params;
  const userData = req.body;
  // Операция "создать или полностью заменить"
  const updatedUser = await User.findOneAndUpdate(
    { _id: id },
    userData,
    { upsert: true, new: true, runValidators: true }
  );
  res.json(updatedUser);
});
// Повторный вызов PUT /api/users/123 с теми же данными даст идентичный результат.

Неидемпотентные методы: POST (создаёт новый ресурс при каждом вызове) и PATCH (может применяться неидемпотентно, если операция не является чистой заменой, например, инкремент счётчика).

Ответ 18+ 🔞

Давай разберём эту штуку, а то народ путается, как последний раз в темноте. Идемпотентность, блядь. Звучит как болезнь какая-то, а на деле — простая, но охуенно важная вещь.

Представь, ты нажимаешь кнопку «Оплатить» в интернет-магазине. Раз. Не грузит. Два. Опять нихуя. Три. И тут приходит три смс от банка, что ты купил три одинаковых телевизора. Вот это и есть пиздопроебина — метод был неидемпотентный. А должен быть такой, чтобы ты мог тыкать в эту кнопку до посинения, но купил ровно один телевизор, а не овердохуища. Понимаешь, о чём я? Это надёжность, чувак. Доверия ебать ноль к тем, кто это не соблюдает.

Так, какие методы идемпотентные, то есть безопасные для повторения:

  • GET: Это как посмотреть в холодильник. Смотри хоть сто раз — колбаса сама не появится и не исчезнет. Только для чтения.
  • PUT: Это когда ты пришёл и полностью заменил содержимое холодильника. Поставил новую колбасу, сыр, пиво. Пришёл через минуту, сделал то же самое — в холодильнике ровно то же самое, что ты только что положил. Результат не меняется, ебушки-воробушки.
  • DELETE: Выкинул колбасу в мусорку. Пришёл, попытался выкинуть её ещё раз — а её уже нет, мусорка пустая. Состояние мира не поменялось, ты просто снова получил факт, что колбасы нет.
  • HEAD: Это как GET, но ты только приоткрыл дверцу холодильника, посмотрел, холодно ли там, и закрыл. Тело ответа (саму колбасу) не трогал.

Вот тебе живой пример, как это PUT выглядит в коде. Смотри, не зевай:

app.put('/api/users/:id', async (req, res) => {
  const { id } = req.params;
  const userData = req.body;
  // Операция "создать или полностью заменить"
  const updatedUser = await User.findOneAndUpdate(
    { _id: id },
    userData,
    { upsert: true, new: true, runValidators: true }
  );
  res.json(updatedUser);
});
// Повторный вызов PUT /api/users/123 с теми же данными даст идентичный результат.

Видишь? Сколько раз ни шли этот запрос с одними данными для юзера с id=123 — в базе будет лежать одна и та же хуйня. Идемпотентность, мать её.

А теперь неидемпотентные, с ними осторожно:

  • POST: Это каждый раз, как отправить заявку на доставку новой пиццы. Нажал пять раз — получил пять пицц и пять курьеров у двери. Состояние системы меняется кардинально.
  • PATCH: А вот тут, ёпта, интересно. Он может быть как идемпотентным (если ты просто заменяешь поле целиком), так и нет. Например, если это операция «увеличить счётчик просмотров на 1». Каждый новый запрос будет менять число. Это уже не идемпотентно. Подозрение ебать чувствую к таким операциям.

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