HATEOAS

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

HATEOAS (англ. Hypermedia as the Engine of Application State, "Гіпермедіа як рушій застосункового стану") — обмеження на архітектуру мережевих REST-застосунків, що вирізняє її серед інших архітектур мережевих застосунків.

Rest-from-get-to-hateoas-25-728.

З HATEOAS клієнт взаємодіє з мережевим застосунком, сервери якого динамічно надають інформацію через гіпермедіа. Клієнт REST не потребує попередніх знань про те, як взаємодіяти з застосунком або сервером поза загальним розумінням гіпермедіа.

На відміну від цього, клієнти та сервери з CORBA взаємодіють через фіксований інтерфейс поширений через документацію або мовою опису інтерфейсу (МОІ).

Завдяки HATEOAS, клієнт відв'язується від сервера, що дозволяє серверу розвиватися незалежно.

Приклад[ред. | ред. код]

Клієнт REST взаємодіє з REST застосунком через просту фіксовану URL-адресу. Всі майбутні дії, які може здійснити клієнт, описані в представленні ресурсу повернутому із сервера. Типи медіа, які використовуються в отриманому описі ресурсу або можливі зв'язки між посиланнями - стандартизовані. Клієнт переходить між станами застосунку, обираючи посилання у представленні ресурсу або маніпулюючи представленням іншими способами, які надає його тип медіа. Таким чином, RESTful взаємодія обумовлена гіпермедією, а не попередньо описаною документацією.[1]

Наприклад, [2] цей GET запит отримує ресурс облікового запису, запитуючи деталі в представленні JSON:

GET /accounts/12345/ HTTP/1.1
Host: bank.example.com
Accept: application/vnd.acme.account+json
...

Відповідь сервера:

HTTP/1.1 200 OK
Content-Type: application/vnd.acme.account+json
Content-Length: ...

{
    "account": {
        "account_number": 12345,
        "balance": {
            "currency": "usd",
            "value": 100.00
        },
        "links": {
            "deposit": "/accounts/12345/deposit",
            "withdraw": "/accounts/12345/withdraw",
            "transfer": "/accounts/12345/transfer",
            "close": "/accounts/12345/close"
        }
    }
}

Відповідь містить всі можливі подальші посилання: внести, зняти, переказати кошти або закрити рахунок.

Коли матиме місце перевитрата коштів, з доступних опцій буде лише 'внесення коштів' (deposit):

HTTP/1.1 200 OK
Content-Type: application/vnd.acme.account+json
Content-Length: ...

{
    "account": {
        "account_number": 12345,
        "balance": {
            "currency": "usd",
            "value": -25.00
        },
        "links": {
            "deposit": "/accounts/12345/deposit"
        }
    }
}

Зараз доступне лише одне посилання: внести більше грошей. У поточному "'стані' інші посилання недоступні. Звідси термін "Двигун стану застосунку". Можливі дії залежать від стану ресурсу.

Клієнту не потрібно розуміти кожен тип медіа та механізм зв'язку, запропонований сервером. Здатність розуміти нові типи медіа може бути набута клієнтом під час виконання запиту до сервера.[3]

Витоки[ред. | ред. код]

Обмеження HATEOAS є невід'ємною частиною "єдиного інтерфейсу" REST, визначеного в докторській дисертації Роя Філдінга.[3] Філдінг далі описав цю концепцію у своєму блозі.[1]

Філдінг пояснює, що мета суворості цього та інших обмежень REST - "розробка програмного забезпечення в масштабах десятиліть: кожна деталь покликана сприяти довговічності програмного забезпечення та незалежній еволюції. Багато обмежень прямо протиставляються короткотерміновій ефективності. На жаль, люди досить хороші в короткостроковому дизайні застосунків і зазвичай жахливі при довгостроковому дизайні."[1]

Посилання[ред. | ред. код]

  1. а б в Fielding, Roy T. (20 жовтня 2008). REST APIs must be hypertext-driven. Архів оригіналу за 18 березня 2010. Процитовано 20 травня 2010.
  2. "The RESTful CookBook". Архів оригіналу за 31 січня 2020. Процитовано 24 січня 2020.
  3. а б Fielding, Roy Thomas (2000). Representational State Transfer (REST). Architectural Styles and the Design of Network-based Software Architectures (PhD). University of California, Irvine. Архів оригіналу за 22 січня 2020. Процитовано 24 січня 2020.