Почему DELETE-запрос является идемпотентным?

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

Ответ

DELETE-запрос считается идемпотентным, потому что многократное выполнение одного и того же запроса приводит к одинаковому конечному состоянию сервера. С точки зрения RESTful API, это означает, что после первого успешного DELETE ресурс удаляется (например, возвращается статус 200 или 204). Последующие идентичные запросы либо также завершатся успешно (если сервер реализует "мягкое" удаление), либо вернут 404 Not Found, но состояние системы (отсутствие ресурса) останется прежним.

Пример в контексте Node.js/Express:

app.delete('/api/users/:id', async (req, res) => {
  const userId = req.params.id;
  // Первый вызов удалит запись
  const deleted = await UserModel.findByIdAndDelete(userId);

  if (deleted) {
    // Ресурс был найден и удален
    return res.status(200).json({ message: 'User deleted' });
  } else {
    // Ресурс уже отсутствует — состояние сервера не изменилось
    return res.status(404).json({ error: 'User not found' });
  }
});

Важное уточнение: Идемпотентность гарантируется для идентичных запросов к одному ресурсу. Если обработчик DELETE имеет побочные эффекты (например, создает лог-запись или отправляет уведомление при каждом вызове), это нарушает строгую идемпотентность с точки зрения состояния всей системы, хотя состояние целевого ресурса остается консистентным.