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.1Host: bank.example.comAccept: application/xml…

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

HTTP/1.1 200 OKContent-Type: application/xmlContent-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 OKContent-Type: application/xmlContent-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 Oct 2008). Дата обращения 20 мая 2010.
  2. «The RESTful CookBook»
  3. 1 2 «Representational State Transfer (REST)»

Ссылки