[Первоначально опубликовано на http://intercoolerjs.org/2016/05/08/hatoeas-is-for-humans.html]
TLDR
- HATEOAS на самом деле представляет собой простую концепцию: сервер отправляет как данные, так и сетевые операции с этими данными клиенту, который не имеет специальных знаний о данных.
- Эта простая, но мощная идея была утеряна, потому что ее обычно рассматривают с точки зрения машин и API, а не с точки зрения людей и HTML.
- Люди имеют уникальную возможность воспользоваться преимуществами HATEOAS так, как машины (пока) не могут.
ХАТЕОАС — Что?
HATEOAS, пожалуй, наименее понятный аспект REST и часто является объектом откровенной ненависти вполне разумных, компетентных разработчиков. Это очень плохо, и это в основном связано с тем, что концепции HATEOAS и REST были применены к API (первоначально XML, затем JSON), а не к тому, где они изначально возникли: к людям и HTML в Интернете.
Давайте посмотрим, смогу ли я дать простое (хотя и неполное) объяснение того, что такое HATEOAS, а затем объяснить, почему он так хорошо работает с людьми и HTML и почему плохо работает с машинами и JSON.
Начнем с самого начала. Что означает аббревиатура HATEOAS?
Простой!
«Гипермедиа как двигатель состояния приложения»
Хорошо, может быть, не так просто. Так что же означает это?
Это означает следующее: все «состояние» (то есть как данные, так и сетевые действия, доступные для этих данных) закодировано в гипермедиа (например, HTML), возвращаемом сервером. Клиенты не знают ничего конкретного о какой-либо конкретной конечной точке сети: как данные, так и сетевые операции, доступные для этих данных, поступают с сервера.
Важный момент, повторюсь еще раз: и данные, и сетевые операции с этими данными поступают с сервера вместе, в гипермедиа.
Звучит немного объектно-ориентированно, не так ли?
HTML — HATEOAS для людей
Давайте рассмотрим пример, который поможет конкретизировать эту идею. Вместо того, чтобы использовать пример API (что, к сожалению, делает даже статья HATEOAS в Википедии), давайте рассмотрим что-то еще более простое: немного HTML. В конце концов, HTML — это самая распространенная и успешная гипермедиа в мире.
Рассмотрим следующий фрагмент HTML, полученный с сервера, скажем, в следующей конечной точке: /contacts/42:
<div>
<div>
Name: Joe Blow
</div>
<div>
Email: [email protected]
</div>
<div>
<a href="/contacts/42/edit">Edit</a>
<a href="/contacts/42/email">Email</a>
<a href="/contacts/42/archive">Archive</a>
</div>
</div>
Этот фрагмент HTML, как вы заметите, кодирует как данные для контакта, так и действия, доступные для этих данных (редактирование, отправка по электронной почте и архивирование) в виде ссылок. Клиент (браузер) ничего не знает о контактах, он знает только, как взять этот HTML и отобразить его как некий пользовательский интерфейс для взаимодействия с человеком. Это, конечно, не самая эффективная кодировка этих данных, к тому же она перемешана с каким-то другим мусором, но это нормально. Этот другой мусор оказался довольно полезным на стороне клиента, так что давайте пока оставим его без внимания.
Это означает, что веб-приложение, которое общается с помощью HTML, естественным образом удовлетворяет ограничению HATEOAS REST, и никому не нужно много думать об этом.
Если вы когда-либо создавали традиционное веб-приложение, поздравляю, вы реализовали HATEOAS лучше, чем 99% всех разработчиков API.
Следует отметить, что, к сожалению, сам традиционный HTML несколько ограничен в количестве HTTP-методов (в основном GET и POST) и действий пользователя (клики и отправка форм), которые он допускает, что затрудняет реализацию всех преимуществ REST. .
К счастью, intercooler.js, помимо многого другого, исправляет обе эти проблемы с помощью атрибутов ic-put-to, ic-delete-from и т. д. и атрибутов ic-trigger, соответственно. Это дает вам гораздо более богатую и полную программную инфраструктуру для создания веб-приложения REST-ful на основе HTML.
Вы должны использовать его. 😉
Почему скрежет зубов?
Как бы то ни было, мы видим, что, несмотря на все эти причудливые формулировки, HATEOAS почти по-идиотски легко реализовать, просто используя HTML.
Откуда тогда вся ненависть и неразбериха вокруг меня?
Чтобы понять почему, давайте посмотрим на пример с HATEOAS Wikipage:
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">100.00</balance>
<link rel="deposit" href="http://somebank.org/account/12345/deposit" />
<link rel="withdraw" href="http://somebank.org/account/12345/withdraw" />
<link rel="transfer" href="http://somebank.org/account/12345/transfer" />
<link rel="close" href="http://somebank.org/account/12345/close" />
</account>
Это XML API, удовлетворяющий требованиям HATEOAS, поскольку все действия в учетной записи кодируются в виде элементов ссылок. И это здорово, насколько это возможно. Вы получаете Золотую звезду REST за этот API.
Но подумайте, что потребляет эти данные: какой-то клиентский код, возможно, от имени еще одного (толстого или веб-клиента) в будущем, или, возможно, автоматизированный скрипт. Как бы то ни было, с этим, скорее всего, имеет дело код, а не человек.
Что он может сделать со всеми этими действиями? Действия, заметьте, динамические, но сам скрипт, вероятно, нет: ему нужно либо обработать все возможные действия, либо передать их человеку для обработки, верно?
И это доходит до сути проблемы: у кода (пока) нет агентства.
Он не может разумно решить, что делать перед лицом новых и неожиданных действий. Кодировщик, пишущий код, может обрабатывать все возможные действия (сложно) или передавать их человеку где-то еще (тоже сложно).
На самом деле, код, скорее всего, обработает несколько действий и просто проигнорирует остальные, так что вся эта работа для Gold REST Star, к сожалению, будет потрачена впустую.
Агентство как услуга (AAAS)
Так вот, люди не очень хороши, но (но!) одна вещь, в которой мы довольно хороши, — это свобода воли. Мы можем принимать решения в новых и новых ситуациях, разбираться в несколько хаотичной среде и узнавать что-то новое.Мы можем понять, когда появляется новое действие, связанное с некоторыми данными, если мы хотите предпринять это действие.
Это просто то, что мы делаем.
Мне нравится переворачивать отношения клиент-сервер и рассматривать людей-пользователей программной системы как предоставляющих агентство как услугу (AAAS) для сервера.
Программное обеспечение сервера знает все о данных и о том, какие действия доступны с этими данными, но понятия не имеет, что, черт возьми, делать. К счастью, эти в остальном неуклюжие люди появляются и будут тыкать и подталкивать сервер, чтобы предоставить помощь серверу, в которой он так отчаянно нуждается. Сервер, конечно, хочет говорить с людьми на языке (гипермедиа), который люди находят приятным или, по крайней мере, терпимым.
И этот язык — HTML.
Итак, вы можете видеть: система, удовлетворяющая HATEOAS, бесполезна, если гипермедиа не потребляется чем-то с агентурой. Это люди, поэтому для того, чтобы HATEOAS была эффективной, гипермедиа должна быть гуманной.
Опять же, это HTML. Я не осознавал, насколько это особенное, пока не начал писать веб-приложения на 20-м году жизни.
Когда у нас будет сильный ИИ, возможно, ситуация изменится. Но это то, что мы имеем сегодня.
Итак, как мы должны говорить с машинами?
Ну и хорошо. Но как быть с машинами? Нужно написать интеграцию, скрипты, парсинг и толстые клиенты, и все они также должны взаимодействовать с серверами, верно?
Это, конечно, правильно, и, не стыжусь признаться, я не уверен, какой здесь правильный ответ и есть ли он вообще.
REST-minus-HATEOAS во многих случаях работает нормально. Конечные точки в стиле RPC когда-то были популярны и, похоже, снова становятся популярными. Все они кажутся мне достаточно работоспособными.
Но в чем я убежден и в чем я надеюсь убедить вас, так это в том, что HATEOAS в значительной степени тратится на машины.
HATEOAS для людей.