Ответ
Идемпотентность в контексте HTTP и проектирования API — это свойство операции, при котором её многократное выполнение с одними и теми же входными данными приводит к одинаковому результату и состоянию системы, как и после первого выполнения.
Ключевой момент: Идемпотентность — о состоянии системы, а не о коде ответа. Ответ сервера (например, статус 404 после первого удаления и 200 после второго) может отличаться, но итоговое состояние ресурса на сервере должно быть таким же.
Классификация HTTP-методов с точки зрения идемпотентности:
| Метод | Идемпотентен? | Почему | Пример для REST API (Node.js + Express) |
|---|---|---|---|
| GET | Да | Только получение данных, не изменяет состояние. | app.get('/users/:id', handler) — многократные вызовы не создадут новых пользователей. |
| PUT | Да | Полная замена ресурса. Повторный запрос с теми же данными оставит ресурс в том же конечном состоянии. | app.put('/users/:id', handler) — обновит пользователя. Второй идентичный запрос не изменит результат. |
| DELETE | Да | Удаление ресурса. После первого успешного удаления ресурса его больше нет, последующие запросы также вернут 404 или 410, но состояние системы (отсутствие ресурса) не изменится. |
app.delete('/users/:id', handler) |
| POST | Нет | Создание нового ресурса. Каждый вызов обычно создает новый объект, изменяя состояние системы. | app.post('/users', handler) — каждый запрос создаст нового пользователя с новым ID. |
| PATCH | Нет (чаще всего) | Частичное обновление. Может быть идемпотентным, если операция сама по себе идемпотентна (например, установка поля в конкретное значение), но в общем случае — нет. | Неидентичный PATCH: { "op": "increment", "path": "/views", "value": 1 } |
Зачем это важно в Node.js бэкенде? Для обеспечения надежности. Сетевые сбои или таймауты могут приводить к повторной отправке запросов клиентом. Идемпотентные операции (PUT, DELETE) безопасны для такого повтора. Для неидемпотентных (POST) нужно реализовывать механизмы предотвращения дублирования (idempotency keys).
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶