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

Какие знаешь идемпотентные методы?

2.0 Middle🔥 141 комментариев
#API и сетевые протоколы#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Идемпотентные методы HTTP

Идемпотентность — это свойство операции, при котором повторное выполнение дает тот же результат, что и первое выполнение. В контексте HTTP это критически важно для создания надежных API.

Безопасные и идемпотентные методы

GET

Самый идемпотентный метод. Запрашивает ресурс и не должен вызывать побочные эффекты:

GET /api/users/123
GET /api/users/123

HEAD

Аналог GET, но без тела ответа. Идемпотентен:

HEAD /api/users/123

PUT

Замещает весь ресурс — идемпотентен:

PUT /api/users/123 { "name": "John", "age": 30 }
PUT /api/users/123 { "name": "John", "age": 30 }

DELETE

Удаляет ресурс. Первый DELETE возвращает 204, второй — 404, но эффект идентичен.

PATCH (условно)

Частичное обновление. Идемпотентен только при правильной реализации.

Неидемпотентный метод: POST

POST часто используется для создания новых ресурсов:

POST /api/users
{ "name": "John", "email": "john@example.com" }
// Первый запрос: создан пользователь (ID: 1)
// Второй запрос: создан еще один пользователь (ID: 2)

Это опасно при сетевых ошибках. Решение — использовать Idempotency Key:

POST /api/payments
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
{ "amount": 100 }

Практическая реализация в Node.js

const idempotencyCache = new Map();

app.post('/api/payments', (req, res) => {
  const idempotencyKey = req.headers['idempotency-key'];
  
  if (!idempotencyKey) {
    return res.status(400).json({ error: 'Idempotency-Key required' });
  }
  
  if (idempotencyCache.has(idempotencyKey)) {
    return res.json(idempotencyCache.get(idempotencyKey));
  }
  
  const result = createPayment(req.body);
  idempotencyCache.set(idempotencyKey, result);
  res.json(result);
});

Почему это важно?

  1. Надежность — при потере соединения можно безопасно повторить запрос
  2. Консистентность — данные не дублируются
  3. User Experience — клиент может переправить запрос без опасения создать дубль

Идемпотентность — основа создания robust API систем.