Назад к вопросам
Middle
3
Как предотвратить двойное списание при повторном запросе (идемпотентность)?
Компании, где спрашивали
TokenTech
Ответ от нейросети
sobes.tech AI
Чтобы предотвратить двойное списание при повторном запросе, используется идемпотентность — гарантия, что повторный вызов с теми же параметрами не приведёт к повторному изменению состояния.
Основные подходы:
-
Использование уникального идентификатора транзакции (idempotency key). Клиент генерирует уникальный ключ для каждой операции. Сервер сохраняет результат операции с этим ключом и при повторном запросе с тем же ключом возвращает сохранённый результат, не выполняя списание повторно.
-
Проверка состояния операции. Перед списанием проверяется, не была ли операция уже выполнена (например, по статусу заказа или платежа).
Пример на JavaScript (fetch):
const idempotencyKey = 'unique-transaction-id-123';
fetch('/api/charge', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Idempotency-Key': idempotencyKey
},
body: JSON.stringify({ amount: 100 })
})
.then(response => response.json())
.then(data => console.log(data));
На сервере нужно реализовать логику сохранения и проверки ключа.