[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-kak-versionirovat-rest-api":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},1118,"kak-versionirovat-rest-api",34,"rest-api","REST API","🌐","Как версионировать REST API?","Версионирование позволяет развивать API без нарушения обратной совместимости для существующих клиентов.\n\n| Подход | Пример | Плюсы | Минусы |\n|--------|--------|-------|--------|\n| Версия в URL | `GET \u002Fapi\u002Fv1\u002Fusers` | Простота, наглядность, легко кэшировать | Нарушает принцип REST (URI = ресурс, не версия) |\n| Кастомный заголовок | `X-API-Version: 1` | URI остаётся чистым | Менее очевидно, сложнее тестировать |\n| Accept-заголовок (Media Type) | `Accept: application\u002Fvnd.myapi.v1+json` | Наиболее RESTful | Сложнее в реализации и тестировании |\n| Query-параметр | `GET \u002Fapi\u002Fusers?version=1` | Простота | Загрязняет URI, может конфликтовать с параметрами |\n\nНа практике версия в URL — самый распространённый и рекомендуемый подход для большинства проектов благодаря своей простоте и прозрачности.\n\n\u003Cdetails>\u003Csummary>Примеры реализации в Spring\u003C\u002Fsummary>\n\n```java\n\u002F\u002F 1. Версия в URL\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fv1\u002Fusers\")\npublic class UserControllerV1 {\n    @GetMapping\n    public List\u003CUserV1Dto> getUsers() { ... }\n}\n\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fv2\u002Fusers\")\npublic class UserControllerV2 {\n    @GetMapping\n    public List\u003CUserV2Dto> getUsers() { ... }\n}\n\n\u002F\u002F 2. Версия в заголовке\n@GetMapping(value = \"\u002Fusers\", headers = \"X-API-Version=1\")\npublic List\u003CUserV1Dto> getUsersV1() { ... }\n\n@GetMapping(value = \"\u002Fusers\", headers = \"X-API-Version=2\")\npublic List\u003CUserV2Dto> getUsersV2() { ... }\n\n\u002F\u002F 3. Версия через Accept-заголовок\n@GetMapping(value = \"\u002Fusers\", produces = \"application\u002Fvnd.myapi.v1+json\")\npublic List\u003CUserV1Dto> getUsersV1() { ... }\n\n@GetMapping(value = \"\u002Fusers\", produces = \"application\u002Fvnd.myapi.v2+json\")\npublic List\u003CUserV2Dto> getUsersV2() { ... }\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** нужно знать все четыре подхода с их плюсами и минусами. Частая ошибка — не упомянуть, что версия в URL — самый популярный на практике, хотя формально не самый RESTful.","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":20,"keywords":21,"schemaAnswer":20,"featuredSnippetReady":22},"Как версионировать REST API? — Gymterview","Версионирование позволяет развивать API без нарушения обратной совместимости для существующих клиентов.",[15,13],true]