Що означає "idempotent request"?
Що значить "ідемпотентність" (idempotence)
Ідемпотентність - це властивість операції, при якій повторне виконання дає той самий результат, що й одне виконання.
Іншими словами:
"Скільки б разів ти не викликав цей запит, результат не зміниться (якщо вхідні дані однакові)."
Простий приклад
Уяви, у тебе є endpoint:
DELETE /api/users/42- Перший виклик видаляє користувача
id=42. - Другий виклик - користувач уже видалений, але результат системи не змінився (користувача немає).
Отже, DELETE - ідемпотентний запит.
Формально
HTTP-запит називається ідемпотентним, якщо повторний виклик з тими самими параметрами не змінює стан ресурсу (і повертає той самий результат).
Ідемпотентність і HTTP-методи
| Метод | Ідемпотентний? | Чому |
|---|---|---|
| GET | Так | Отримує дані, не змінює сервер |
| HEAD | Так | Як GET, але без тіла |
| PUT | Так | "Перезаписує" ресурс цілком - 2 рази поспіль = той самий результат |
| DELETE | Так | Після видалення повторний DELETE нічого не змінює |
| OPTIONS | Так | Лише повертає метаінформацію |
| POST | Ні | Кожен виклик створює новий ресурс (наприклад, замовлення, коментар) |
| PATCH | Залежить | Може бути ідемпотентним, якщо вносить ті самі зміни повторно |
Приклади запитів
Ідемпотентні запити
GET - просте читання:
GET /api/users/5-> повертає користувача, не змінює стан сервера.
PUT - оновлення ресурсу:
PUT /api/users/5
{
"name": "Alex"
}-> можна викликати 10 разів поспіль - результат однаковий (у користувача ім'я "Alex").
DELETE - видалення ресурсу:
DELETE /api/users/5-> видаляє один раз, повторні виклики нічого не змінюють.
Неідемпотентні запити
POST - створення ресурсу:
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 передбачуваним і безпечним при збоях чи повторних викликах.
Приклад у коді
// Неідемпотентний: створює нове замовлення
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.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.