Понимание HATEOAS

HATEOAS (Hypermedia as the Engine of Application State) - это правило архитектуры REST приложения.

Гипермедиа сайт предоставляет информацию для динамической навигации по REST интерфейсам сайта, включая гипермедиа-ссылки с ответами. Это отличает их от систем на основе SOA и WSDL интерфейсов. С SOA сервера и клиенты как правило должны иметь доступ к фиксированной спецификации, которая может быть где-угодно на текущем web-сайте, другом, либо отправлена по e-mail.

Произношение HATEOAS разное. Некоторые произносят как "hate-ee-os", другие - "hideous" или "hate O-A-S". Под этим термином также имеют ввиду гипермедиа системы.

Примеры

Ниже представлен код объекта Customer:

class Customer {
    String name;
}

Простое JSON представление выглядит так:

{ 
    "name" : "Alice"
}

Здесь информация о клиенте, но она ничего не содержит из числа её релевантных ссылок.

HATEOAS ответ будет выглядеть следующим образом:

{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } ]
}

Этот ответ содержит не только имя человека, но и включает URL, по которому он расположен.

  • rel означает отношение. В данном случае, гиперссылка на себя. Более сложные системы могут включать другие отношения. К примеру, отношение "rel":"customer" связывает запрос с другим клиентом
  • href - это полная URL, которая однозначно указывает на ресурс
Не смотря на то, что эти ответы показаны в JSON, XML также применим как стандарт формата ответа. HATEOAS не накладывает требование на использование какого-либо одного из форматов. Гипермедиа ссылки находятся в центре внимания HATEOAS.

Возможно построение более сложных отношений. С HATEOAS на выходе можно легко определить, как взаимодействовать с сервисом, не зная спецификации или другого соответствующего документа.

Взгляните на каталог ниже из приложения Spring Data Book:

{
    "content": [ {
        "price": 499.00,
        "description": "Apple tablet device",
        "name": "iPad",
        "links": [ {
            "rel": "self",
            "href": "http://localhost:8080/product/1"
        } ],
        "attributes": {
            "connector": "socket"
        }
    }, {
        "price": 49.00,
        "description": "Dock for iPhone/iPad",
        "name": "Dock",
        "links": [ {
            "rel": "self",
            "href": "http://localhost:8080/product/3"
        } ],
        "attributes": {
            "connector": "plug"
        }
    } ],
    "links": [ {
        "rel": "product.search",
        "href": "http://localhost:8080/product/search"
    } ]
}

Отображены не только элементы и их цены, но и URL для каждого ресурса, предоставляя информацию о том, как получить доступ к этим ресурсам. В соответствии с Richardson Maturity Model, HATEOAS рассматривается как последний уровень REST. Это означает, что каждая ссылка предполагает реализацию стандартных REST действий GET, POST, PUT и DELETE (или их подмножество). Т.о., предоставляя ссылки, как показано выше, клиенту дается информация по навигации по сервису.

С оригинальным текстом урока вы можете ознакомиться на spring.io.

comments powered by Disqus