Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що означає "idempotent request"?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Ідемпотентність** - це властивість операції, при якій повторне виконання дає той самий результат, що й одне виконання: скільки б разів ти не викликав такий запит, результат не зміниться, якщо вхідні дані однакові. **Ключове:** у REST `GET`, `PUT`, `DELETE` і `HEAD` ідемпотентні, `POST` - ні (кожен виклик створює новий ресурс), а `PATCH` залежить від реалізації, і саме ідемпотентність дозволяє безпечно повторювати запити при збоях мережі.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що значить "ідемпотентність" (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**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.