HATEOAS
HATEOAS (Hypermedia as the Engine of Application State — гипермедиа как движок состояния приложения) — это принцип архитектуры RESTful веб-сервисов, согласно которому сервер предоставляет клиенту не только запрашиваемые данные, но и набор ссылок (гипермедиа), описывающих возможные дальнейшие действия. Это позволяет клиенту динамически взаимодействовать с API, не имея заранее зафиксированной схемы URL-адресов.
История и происхождение
Термин HATEOAS был впервые сформулирован Роем Филдингом в его докторской диссертации «Architectural Styles and the Design of Network-based Software Architectures» (2000 год), где он описал архитектурный стиль REST. Филдинг выделил HATEOAS как одно из ключевых ограничений, отличающих истинный REST от так называемых «RESTful» сервисов, которые часто ограничиваются только использованием HTTP-методов и форматов данных, игнорируя гипермедиа.
Идея HATEOAS восходит к более ранним концепциям гипертекста и гипермедиа, разработанным в 1960-х годах (в частности, Тедом Нельсоном и Дугласом Энгельбартом) и реализованным в World Wide Web. Веб-сайты по своей природе являются гипермедийными: HTML-страницы содержат ссылки на другие страницы, которые пользователь может посетить. HATEOAS переносит этот принцип на уровень API.
Основные принципы
Динамическое обнаружение возможностей
Клиент, отправляя запрос к API, получает в ответе не только запрошенные данные, но и список ссылок (URL), которые указывают на возможные следующие шаги. Например, при создании нового заказа в интернет-магазине сервер может вернуть ссылки на оплату, отмену заказа или просмотр его статуса. Клиенту не нужно знать эти URL заранее — он находит их в ответе.
Отсутствие жёсткой привязки к URL
Традиционные REST API часто требуют, чтобы клиент знал структуру URL (например, /orders/123, /orders/123/pay). При изменении серверной структуры URL такие клиенты ломаются. HATEOAS решает эту проблему: клиент следует ссылкам, предоставленным сервером, а не конструирует URL самостоятельно. Это делает API более устойчивым к изменениям.
Самоописываемость ответов
Ответ сервера в стиле HATEOAS содержит не только данные, но и метаинформацию о том, как эти данные можно использовать. Клиент может интерпретировать ссылки и выбирать действия, не обращаясь к внешней документации (хотя она всё равно может быть полезна для понимания семантики ссылок).
Структура ответа
Типичный ответ HATEOAS содержит два основных компонента:
- Данные — собственно запрашиваемая информация (например, список товаров, информация о пользователе).
- Ссылки — массив объектов, каждый из которых обычно включает:
rel(relation) — семантическое название связи (например,self,next,pay,cancel).href— URL, по которому можно выполнить действие.method(опционально) — HTTP-метод (GET, POST, PUT, DELETE), который следует использовать.
Пример ответа в формате JSON:
``json { "orderId": 123, "status": "pending", "total": 1500.00, "_links": { "self": { "href": "/orders/123", "method": "GET" }, "pay": { "href": "/orders/123/pay", "method": "POST" }, "cancel": { "href": "/orders/123", "method": "DELETE" } } } ``
Реализация и форматы
Форматы представления
HATEOAS не привязан к какому-то одному формату данных. Наиболее распространённые:
- JSON — используется с гипермедийными профилями, такими как HAL (Hypertext Application Language), JSON-LD, Siren или Collection+JSON.
- XML — может применяться с XLink или Atom.
- HTML — в некоторых случаях API может возвращать HTML-фрагменты с встроенными ссылками.
Примеры реализации
- Spring HATEOAS (Java) — библиотека для создания REST API с гипермедиа в экосистеме Spring.
- Django REST Framework (Python) — позволяет добавлять ссылки через сериализаторы.
- Microsoft ASP.NET Web API — поддерживает HATEOAS через расширения.
Преимущества и недостатки
Преимущества
- Гибкость и эволюционируемость — сервер может изменять URL-структуру без нарушения работы клиентов, если ссылки остаются корректными.
- Снижение связанности — клиент не зависит от жёстко закодированных URL, что упрощает поддержку и обновление.
- Автоматическое обнаружение — клиент может «исследовать» API, следуя ссылкам, что упрощает интеграцию для разработчиков и автоматизированных инструментов.
- Единообразие — все действия описываются через гипермедиа, что делает API более предсказуемым.
Недостатки
- Сложность реализации — требует дополнительной работы на серверной стороне для генерации и поддержки ссылок.
- Усложнение клиентской логики — клиент должен уметь анализировать и выбирать ссылки, что может быть сложнее, чем вызов заранее известных URL.
- Отсутствие стандартизации — нет единого общепринятого формата для HATEOAS (HAL, Siren, JSON-LD и другие конкурируют), что может затруднить совместимость.
- Избыточность — для простых API, где структура URL стабильна, HATEOAS может быть излишним и увеличивать размер ответов.
Критика и ограничения
На практике HATEOAS редко реализуется в полном объёме. Большинство современных REST API (в том числе популярные сервисы, такие как Twitter, GitHub, Stripe) не следуют этому принципу строго. Причины:
- Прагматизм — разработчики часто предпочитают простоту и скорость разработки полной гипермедийной архитектуре.
- Сложность для клиентов — мобильные и веб-приложения обычно имеют жёстко заданные пользовательские интерфейсы, и динамическое обнаружение ссылок не всегда оправдано.
- Необходимость документации — даже при использовании HATEOAS клиентам всё равно нужна документация для понимания семантики ссылок (значения
rel).
Некоторые критики утверждают, что HATEOAS — это идеализированная концепция, которая редко приносит практическую пользу в реальных проектах, особенно в условиях быстро меняющихся требований и ограниченных ресурсов.
Связанные концепции
- REST — архитектурный стиль, частью которого является HATEOAS.
- Hypermedia — общее понятие для систем, где данные содержат ссылки на другие данные.
- HAL (Hypertext Application Language) — один из форматов для реализации HATEOAS в JSON.
- GraphQL — альтернативный подход к API, где клиент сам определяет структуру запроса, но не использует гипермедиа.
Источники
- Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation, University of California, Irvine.
- Richardson, L., & Ruby, S. (2007). RESTful Web Services. O'Reilly Media.
- Amundsen, M. (2011). RESTful Web APIs. O'Reilly Media.
- Документация Spring HATEOAS (spring.io/projects/spring-hateoas).
- Документация HAL (stateless.co/hal_specification.html).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →