[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-chto-takoe-idempotentnyy-klyuch-idempotency-key":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1227,"chto-takoe-idempotentnyy-klyuch-idempotency-key",34,"rest-api","REST API","🌐","Что такое идемпотентный ключ (Idempotency Key)?","Идемпотентный ключ (Idempotency Key) — уникальный идентификатор, передаваемый клиентом в запросе, позволяющий серверу распознавать повторные запросы и не выполнять операцию дважды.\n\n> **Аналогия из жизни:** идемпотентный ключ — как номер платёжного поручения в банке. Если вы случайно отправите одно и то же поручение дважды, банк увидит, что поручение с таким номером уже обработано, и не спишет деньги повторно.\n\n### Зачем нужен\n\nМетод POST не является идемпотентным. При сетевых ошибках (таймаут, разрыв соединения) клиент не знает, был ли запрос обработан. Повторная отправка может привести к дублированию (двойное списание денег, двойное создание заказа).\n\n### Как работает\n\n```\nPOST \u002Fapi\u002Fpayments HTTP\u002F1.1\nIdempotency-Key: 550e8400-e29b-41d4-a716-446655440000\nContent-Type: application\u002Fjson\n\n{\"amount\": 1000, \"currency\": \"RUB\", \"recipientId\": 42}\n```\n\n1. Сервер проверяет, обрабатывался ли запрос с таким ключом.\n2. Если нет — обрабатывает и сохраняет результат.\n3. Если да — возвращает сохранённый результат без повторного выполнения.\n\n\u003Cdetails>\u003Csummary>Реализация в Spring\u003C\u002Fsummary>\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fpayments\")\n@RequiredArgsConstructor\npublic class PaymentController {\n\n    private final PaymentService paymentService;\n    private final IdempotencyService idempotencyService;\n\n    @PostMapping\n    public ResponseEntity\u003CPaymentResponse> createPayment(\n            @RequestHeader(\"Idempotency-Key\") String idempotencyKey,\n            @Valid @RequestBody PaymentRequest request) {\n\n        \u002F\u002F Проверяем, есть ли уже результат\n        return idempotencyService.findByKey(idempotencyKey)\n            .map(cached -> ResponseEntity.ok(cached))\n            .orElseGet(() -> {\n                PaymentResponse response = paymentService.processPayment(request);\n                idempotencyService.save(idempotencyKey, response);\n                return ResponseEntity.status(HttpStatus.CREATED).body(response);\n            });\n    }\n}\n\n@Service\n@RequiredArgsConstructor\npublic class IdempotencyService {\n\n    private final IdempotencyRepository repository;\n\n    public Optional\u003CPaymentResponse> findByKey(String key) {\n        return repository.findByKey(key)\n            .map(entry -> deserialize(entry.getResponse()));\n    }\n\n    public void save(String key, PaymentResponse response) {\n        IdempotencyEntry entry = new IdempotencyEntry();\n        entry.setKey(key);\n        entry.setResponse(serialize(response));\n        entry.setCreatedAt(LocalDateTime.now());\n        entry.setExpiresAt(LocalDateTime.now().plusHours(24));\n        repository.save(entry);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\nКлючи обычно имеют срок жизни (24 часа) и хранятся в БД или Redis. Паттерн широко используется в платёжных системах (Stripe, Tinkoff, YooMoney).\n\n> **На собеседовании:** ключевое — объяснить, зачем нужен Idempotency Key (для POST-запросов при сетевых ошибках) и как он работает (проверка + сохранение результата). Частая ошибка — путать идемпотентность метода и Idempotency Key.","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое идемпотентный ключ (Idempotency Key)? — Gymterview","Идемпотентный ключ (Idempotency Key) — уникальный идентификатор, передаваемый клиентом в запросе, позволяющий серверу распознавать повторные запросы и не выполн","Идемпотентный ключ (Idempotency Key) — уникальный идентификатор, передаваемый клиентом в запросе, позволяющий серверу ра",[15,13],"Идемпотентный ключ (Idempotency Key) — уникальный идентификатор, передаваемый клиентом в запросе, позволяющий серверу распознавать повторные запросы и не выполнять операцию дважды.",true]