HATEOAS

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

HATEOAS (Hypermedia as the Engine of Application State, дословно «гипермедиа как движок для состояния приложения») — архитектурные ограничения для REST-приложений.

С помощью HATEOAS клиент взаимодействует с сетевым приложением, сервер которого обеспечивает динамический доступ через гипермедиа. REST-клиенту не требуется заранее знать, как взаимодействовать с приложением или сервером за пределом гипермедиа.

В отличие от архитектуры SOA, где взаимодействие клиента с сервером строго определены интерфейсом, HATEOAS отделяет клиента от сервера и позволяет им независимо развиваться.

REST-клиент обращается к фиксированному URL, а все последующие действия клиента становятся известными из возвращаемых с сервера ресурсов. Типы ресурсов, представления и их связи стандартизированы. Клиент проходит по ресурсам, выбирая ссылки или взаимодействуя любым другим способом, возможным для этого типа ресурса. Таким образом RESTful-взаимодействия работают через гипермедиа, а не через заранее указанный интерфейс[1].

Например, сделать запрос возвращающий ресурс счёта в XML-представлении[2]:

GET /accounts/12345 HTTP/1.1
Host: bank.example.com
Accept: application/xml
...

Ответ будет таким:

HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...

<?xml version="1.0"?>
<account>
    <account_number>12345</account_number>
    <balance currency="usd">100.00</balance>
    <link rel="deposit" href="https://bank.example.com/accounts/12345/deposit" />
    <link rel="withdraw" href="https://bank.example.com/accounts/12345/withdraw" /> 
    <link rel="transfer" href="https://bank.example.com/accounts/12345/transfer" />
    <link rel="close" href="https://bank.example.com/accounts/12345/close" />
</account>

Ответ содержит ссылки на депозит, снятие, перевод и закрытие аккаунта. В случае отрицательного баланса доступен только депозит:

HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...

<?xml version="1.0"?>
<account>
    <account_number>12345</account_number>
    <balance currency="usd">-25.00</balance>
    <link rel="deposit" href="https://bank.example.com/account/12345/deposit" />
</account>

Теперь доступна только одна ссылка: внести больше денег. Отсюда «the Engine of Application State» в названии. Возможные действия различаются в зависимости от состояния ресурса. Клиенту не нужно знать заранее типы ресурсов и механизмы взаимодействия с ним через сервер. Понимание новых типов ресурсов приобретается во время исполнения при получении ресурсов от сервера[3].

В докторской диссертации Роя Филдинга определены ограничения HATEOAS как неотъемлемой части функции «единого интерфейса»[3][1].

Примечания

[править | править код]
  1. 1 2 Fielding, Roy T. REST APIs must be hypertext-driven (20 октября 2008). Дата обращения: 20 мая 2010. Архивировано 18 марта 2010 года.
  2. "The RESTful CookBook". Дата обращения: 1 ноября 2017. Архивировано 31 января 2020 года.
  3. 1 2 "Representational State Transfer (REST)". Дата обращения: 1 ноября 2017. Архивировано 13 мая 2021 года.