Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Неидемпотентные HTTP методы
Идемпотентные методы — те, которые дают одинаковый результат при повторном выполнении. Неидемпотентные методы меняют состояние сервера.
Неидемпотентные методы
POST — основной неидемпотентный метод
# Первый вызов
POST /api/users
Body: {"name": "John"}
Response: 201 Created, {"id": 1}
# Повторный вызов
POST /api/users
Body: {"name": "John"}
Response: 201 Created, {"id": 2} # ДРУГОЙ результат!
# Два пользователя вместо одного
PATCH — частичное обновление (может быть неидемпотентным)
# Если PATCH добавляет значения:
PATCH /api/scores/1
Body: {"increment": 10}
# Первый раз: score = 10
# Второй раз: score = 20 # РАЗНЫЕ результаты
# Vs идемпотентный PATCH:
PATCH /api/users/1
Body: {"name": "John"} # SET, не INCREMENT
# Первый раз: name = John
# Второй раз: name = John # ОДИНАКОВО
Идемпотентные методы
GET — всегда идемпотентен
GET /api/users/1
# Первый раз: {"id": 1, "name": "John"}
# Второй раз: {"id": 1, "name": "John"} # ОДИНАКОВО
PUT — полное обновление (идемпотентен)
PUT /api/users/1
Body: {"name": "John", "age": 30}
# Первый раз: обновить
# Второй раз: обновить ТЕ ЖЕ значения # ОДИНАКОВО
DELETE — удаление (идемпотентен)
DELETE /api/users/1
# Первый раз: 204 No Content (удалил)
# Второй раз: 404 Not Found (уже удалён) # ОБА раза: ресурс удалён
HEAD — как GET, но без body (идемпотентен)
OPTIONS — получить информацию (идемпотентен)
Таблица идемпотентности
| Метод | Идемпотентен | Примечание |
|---|---|---|
| GET | Да | Не меняет состояние |
| HEAD | Да | Не меняет состояние |
| OPTIONS | Да | Не меняет состояние |
| TRACE | Да | Не меняет состояние |
| PUT | Да | Полное обновление = замена |
| DELETE | Да | Удаление уже удалённого = идемпотентно |
| POST | Нет | Создаёт новые ресурсы |
| PATCH | Зависит | Может быть операцией (не идемпотентен) |
| CONNECT | Нет | Устанавливает соединение |
Примеры неидемпотентности
# 1. POST — создание
POST /api/orders
Body: {"amount": 100}
# Первый вызов: создал заказ #1
# Второй вызов: создал заказ #2 # РАЗНЫЕ
# 2. PATCH с операциями
PATCH /api/accounts/123
Body: [{"op": "add", "path": "/balance", "value": 50}]
# Первый вызов: balance = 150
# Второй вызов: balance = 200 # РАЗНЫЕ
# 3. POST для экшенов
POST /api/users/123/send-email
# Первый вызов: отправил письмо
# Второй вызов: отправил письмо ещё раз # РАЗНЫЕ
Как сделать POST идемпотентным
# Использовать Idempotency-Key
POST /api/orders
Headers: {"Idempotency-Key": "unique-key-123"}
Body: {"amount": 100}
# Первый вызов: создал заказ, сохранил результат с ключом
# Второй вызов с тем же ключом: вернул сохранённый результат
# Результат ОДИНАКОВЫЙ
API design лучшие практики
# ❌ Неправильно: POST для операций
POST /api/users/123/activate
# ✅ Правильно: PUT для изменения состояния
PUT /api/users/123/status
Body: {"status": "active"}
# ❌ Неправильно: POST для идемпотентной операции
POST /api/cache/clear
# ✅ Правильно: DELETE
DELETE /api/cache
Вывод: Неидемпотентные методы: POST и иногда PATCH. Все остальные (GET, PUT, DELETE, HEAD, OPTIONS) идемпотентны. Важно выбирать правильный метод при проектировании API.