[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mikroservisy-kak-versionirovat-api-mikroservisov":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},906,"kak-versionirovat-api-mikroservisov",23,"mikroservisy","Микросервисы","🔗","Как версионировать API микросервисов?","Версионирование API необходимо для обратной совместимости — чтобы обновление одного сервиса не ломало потребителей его API. Три основных подхода: версия в URL, в заголовке и через Content-Type.\n\n| Подход | Пример | Плюсы | Минусы |\n|---|---|---|---|\n| URL | `\u002Fapi\u002Fv1\u002Fpayments` | Простой, наглядный, кешируемый | «Загрязняет» URL |\n| Header | `X-API-Version: 1` | Чистый URL | Сложнее тестировать и документировать |\n| Content-Type | `Accept: application\u002Fvnd.bank.v1+json` | Следует HTTP-стандартам | Самый сложный |\n\n\u003Cdetails>\u003Csummary>Примеры реализации всех подходов\u003C\u002Fsummary>\n\n```java\n\u002F\u002F 1. Версия в URL (наиболее распространённый)\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fv1\u002Fpayments\")\npublic class PaymentControllerV1 {\n    @GetMapping(\"\u002F{id}\")\n    public PaymentResponseV1 getPayment(@PathVariable Long id) {\n        return paymentService.getPaymentV1(id);\n    }\n}\n\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fv2\u002Fpayments\")\npublic class PaymentControllerV2 {\n    @GetMapping(\"\u002F{id}\")\n    public PaymentResponseV2 getPayment(@PathVariable Long id) {\n        return paymentService.getPaymentV2(id);\n    }\n}\n\n\u002F\u002F 2. Версия в заголовке\n@GetMapping(value = \"\u002Fapi\u002Fpayments\u002F{id}\", headers = \"X-API-Version=1\")\npublic PaymentResponseV1 getPaymentV1(@PathVariable Long id) { ... }\n\n@GetMapping(value = \"\u002Fapi\u002Fpayments\u002F{id}\", headers = \"X-API-Version=2\")\npublic PaymentResponseV2 getPaymentV2(@PathVariable Long id) { ... }\n\n\u002F\u002F 3. Версия через Accept header (Content Negotiation)\n@GetMapping(value = \"\u002Fapi\u002Fpayments\u002F{id}\",\n            produces = \"application\u002Fvnd.bank.payment.v1+json\")\npublic PaymentResponseV1 getPaymentV1(@PathVariable Long id) { ... }\n```\n\n\u003C\u002Fdetails>\n\n### Правила эволюции API (обратная совместимость)\n\n- Добавление нового поля в ответ — безопасно (клиенты игнорируют неизвестные поля).\n- Удаление обязательного поля — НЕ безопасно, требует новой версии.\n- Изменение типа поля — НЕ безопасно.\n- Добавление нового опционального параметра запроса — безопасно.\n- Используйте `@JsonIgnoreProperties(ignoreUnknown = true)` на DTO-клиентах для толерантности к новым полям.\n\n### Стратегия deprecation\n\n```java\n@Deprecated(since = \"2025-01-01\", forRemoval = true)\n@GetMapping(\"\u002Fapi\u002Fv1\u002Fpayments\u002F{id}\")\npublic PaymentResponseV1 getPaymentV1(@PathVariable Long id) {\n    response.addHeader(\"Sunset\", \"Sat, 01 Jul 2025 00:00:00 GMT\");\n    response.addHeader(\"Deprecation\", \"true\");\n    response.addHeader(\"Link\", \"\u003C\u002Fapi\u002Fv2\u002Fpayments>; rel=\\\"successor-version\\\"\");\n    return paymentService.getPaymentV1(id);\n}\n```\n\n> **На собеседовании:** рекомендуйте версионирование через URL как самый простой и распространённый подход. Обязательно упомяните правила обратной совместимости и Sunset-заголовок для deprecated API.","","middle",[15],"microservices",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как версионировать API микросервисов? — Gymterview","Версионирование API необходимо для обратной совместимости — чтобы обновление одного сервиса не ломало потребителей его API. Три основных подхода: версия в URL, ","Версионирование API необходимо для обратной совместимости — чтобы обновление одного сервиса не ломало потребителей его A",[15,13],"Версионирование API необходимо для обратной совместимости — чтобы обновление одного сервиса не ломало потребителей его API. Три основных подхода: версия в URL, в заголовке и через Content-Type.",true]