Skip to main content

Що означає "idempotent request"?

Що значить "ідемпотентність" (idempotence)

Ідемпотентність - це властивість операції, при якій повторне виконання дає той самий результат, що й одне виконання.

Іншими словами:

"Скільки б разів ти не викликав цей запит, результат не зміниться (якщо вхідні дані однакові)."


Простий приклад

Уяви, у тебе є endpoint:

javascript
DELETE /api/users/42
  • Перший виклик видаляє користувача id=42.
  • Другий виклик - користувач уже видалений, але результат системи не змінився (користувача немає).

Отже, DELETE - ідемпотентний запит.


Формально

HTTP-запит називається ідемпотентним, якщо повторний виклик з тими самими параметрами не змінює стан ресурсу (і повертає той самий результат).


Ідемпотентність і HTTP-методи

МетодІдемпотентний?Чому
GETТакОтримує дані, не змінює сервер
HEADТакЯк GET, але без тіла
PUTТак"Перезаписує" ресурс цілком - 2 рази поспіль = той самий результат
DELETEТакПісля видалення повторний DELETE нічого не змінює
OPTIONSТакЛише повертає метаінформацію
POSTНіКожен виклик створює новий ресурс (наприклад, замовлення, коментар)
PATCHЗалежитьМоже бути ідемпотентним, якщо вносить ті самі зміни повторно

Приклади запитів

Ідемпотентні запити

GET - просте читання:

javascript
GET /api/users/5

-> повертає користувача, не змінює стан сервера.

PUT - оновлення ресурсу:

javascript
PUT /api/users/5 { "name": "Alex" }

-> можна викликати 10 разів поспіль - результат однаковий (у користувача ім'я "Alex").

DELETE - видалення ресурсу:

javascript
DELETE /api/users/5

-> видаляє один раз, повторні виклики нічого не змінюють.


Неідемпотентні запити

POST - створення ресурсу:

javascript
POST /api/orders { "productId": 10, "quantity": 1 }

-> кожен виклик створює нове замовлення, тобто результат системи змінюється.


Чому це важливо

1. Безпечне повторення запитів

Якщо з'єднання перервалося, клієнт може повторити ідемпотентний запит без страху "дублювання дій".

Приклад:

  • ти викликаєш DELETE /users/42,
  • мережа обірвалася,
  • клієнт повторює запит - сервер у тому самому стані.

А от при POST /orders повтор може створити два замовлення.


2. Кешування

HTTP-клієнти (браузери, CDN, React Query, SWR) можуть кешувати ідемпотентні запити (GET, іноді HEAD), оскільки вони не змінюють стан.


3. Load Balancing / Retry / Fault Tolerance

API-шлюзи, балансувальники і бібліотеки (Axios, React Query) часто автоматично повторюють невдалі запити.

Повтор безпечний лише для ідемпотентних операцій.


4. Дизайн REST API

REST-архітектура будується на принципі, що:

  • GET, PUT, DELETE - ідемпотентні;
  • POST - не ідемпотентний;
  • PATCH - залежить від реалізації.

Це робить API передбачуваним і безпечним при збоях чи повторних викликах.


Приклад у коді

javascript
// Неідемпотентний: створює нове замовлення await api.post('/orders', { productId: 12 }); // Ідемпотентний: оновлює замовлення await api.put('/orders/123', { status: 'paid' }); // Ідемпотентний: видаляє замовлення await api.delete('/orders/123');

Підсумок

ХарактеристикаІдемпотентний запит
Повторний викликНе змінює результат
Змінює стан?Ні (або один раз)
Безпечний для retryТак
Можна кешуватиТак (наприклад, GET)
ПрикладGET, PUT, DELETE

Коротко:

Idempotent request - це запит, який можна виконувати багато разів поспіль, і система залишиться в тому самому стані, що й після першого виконання.

Він потрібен для безпечного повторення, передбачуваності та стійкості API.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.