[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-chto-takoe-hateoas":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},1120,"chto-takoe-hateoas",34,"rest-api","REST API","🌐","Что такое HATEOAS?","HATEOAS (Hypermedia as the Engine of Application State) — принцип REST, согласно которому сервер в ответе предоставляет клиенту ссылки на доступные действия и связанные ресурсы.\n\n> **Аналогия из жизни:** HATEOAS — как навигация в интернет-магазине. Вы открываете страницу товара, и на ней есть ссылки: «Добавить в корзину», «Похожие товары», «Отзывы». Вам не нужно знать URL-ы заранее — страница сама подсказывает, что можно сделать дальше.\n\nОбычный ответ без HATEOAS:\n```json\n{\n  \"id\": 42,\n  \"name\": \"Иван\",\n  \"status\": \"active\"\n}\n```\n\nОтвет с HATEOAS:\n```json\n{\n  \"id\": 42,\n  \"name\": \"Иван\",\n  \"status\": \"active\",\n  \"_links\": {\n    \"self\": {\"href\": \"\u002Fapi\u002Fusers\u002F42\"},\n    \"orders\": {\"href\": \"\u002Fapi\u002Fusers\u002F42\u002Forders\"},\n    \"deactivate\": {\"href\": \"\u002Fapi\u002Fusers\u002F42\u002Fdeactivate\", \"method\": \"POST\"}\n  }\n}\n```\n\n### Преимущества\n\n- Клиент не зависит от жёстко заданных URL.\n- API становится самодокументируемым.\n- Сервер может динамически управлять доступными действиями (например, скрывать ссылку `deactivate` для уже неактивного пользователя).\n\n\u003Cdetails>\u003Csummary>Реализация в Spring HATEOAS\u003C\u002Fsummary>\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fusers\")\npublic class UserController {\n\n    @GetMapping(\"\u002F{id}\")\n    public EntityModel\u003CUser> getUser(@PathVariable Long id) {\n        User user = userService.findById(id);\n\n        EntityModel\u003CUser> model = EntityModel.of(user);\n        model.add(linkTo(methodOn(UserController.class).getUser(id)).withSelfRel());\n        model.add(linkTo(methodOn(OrderController.class).getOrdersByUser(id))\n                  .withRel(\"orders\"));\n\n        if (\"active\".equals(user.getStatus())) {\n            model.add(linkTo(methodOn(UserController.class).deactivateUser(id))\n                      .withRel(\"deactivate\"));\n        }\n\n        return model;\n    }\n\n    @GetMapping\n    public CollectionModel\u003CEntityModel\u003CUser>> getAllUsers() {\n        List\u003CEntityModel\u003CUser>> users = userService.findAll().stream()\n            .map(user -> EntityModel.of(user,\n                linkTo(methodOn(UserController.class).getUser(user.getId())).withSelfRel()))\n            .toList();\n\n        return CollectionModel.of(users,\n            linkTo(methodOn(UserController.class).getAllUsers()).withSelfRel());\n    }\n}\n```\n\nЗависимость:\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n    \u003CartifactId>spring-boot-starter-hateoas\u003C\u002FartifactId>\n\u003C\u002Fdependency>\n```\n\n\u003C\u002Fdetails>\n\nНа практике HATEOAS используется нечасто из-за сложности реализации и того, что большинство клиентов (SPA, мобильные приложения) проще строить с заранее известными URL.\n\n> **На собеседовании:** нужно объяснить принцип и привести пример ответа с `_links`. Бонус — упомянуть, что HATEOAS — это уровень 3 Richardson Maturity Model и что на практике он редко реализуется полностью.","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое HATEOAS? — Gymterview","HATEOAS (Hypermedia as the Engine of Application State) — принцип REST, согласно которому сервер в ответе предоставляет клиенту ссылки на доступные действия и с","HATEOAS (Hypermedia as the Engine of Application State) — принцип REST, согласно которому сервер в ответе предоставляет ",[15,13],"HATEOAS (Hypermedia as the Engine of Application State) — принцип REST, согласно которому сервер в ответе предоставляет клиенту ссылки на доступные действия и связанные ресурсы.",true]