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

«Какие идемпотентные HTTP-методы вы знаете?» — вопрос из категории Сети, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Идемпотентные 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 (может применяться неидемпотентно, если операция не является чистой заменой, например, инкремент счётчика).