← Назад к вопросам

Какие из методов http неидемпотентны?

1.3 Junior🔥 151 комментариев
#REST API и HTTP

Комментарии (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.