Кто-либо знает о примере УСПОКОИТЕЛЬНОГО клиента, который следует за принципом HATEOAS?

Я не нашел убедительного аргумента в пользу использования специальных запросов. Особенно перепутанные с Вашим кодом C#/Java/PHP.

45
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

Мы наполовину сделали это в нашем текущем проекте. Представления, которые мы возвращаем, генерируются из объектов домена, и клиент может запросить их в XML, JSON или XHTML. Если это клиент XHTML, такой как Firefox, то человек видит набор исходящих ссылок из хорошо известного корневого ресурса и может просматривать все остальные ресурсы. Пока что чистый HATEOAS и отличный инструмент для разработчиков.

Но нас беспокоит производительность , когда клиент - это программа, а не человек, использующий браузер. Для наших представлений XML и JSON мы в настоящее время подавили создание связанных ссылок, поскольку они утраивают размеры представления и, таким образом, существенно влияют на сериализацию / десериализацию, использование памяти и пропускную способность. Другая наша проблема эффективности заключается в том, что с чистым HATEOAS, клиентские программы будут делать в несколько раз больше HTTP-запросов при переходе от хорошо известной ссылки к нужной информации. Так что, с точки зрения эффективности , лучше всего, если клиенты знают закодированные в них ссылки.

Но это означает, что клиент должен выполнять много конкатенации строк, чтобы сформировать URI, что подвержено ошибкам и затрудняет перестановку пространства имен ресурсов. Поэтому мы используем систему шаблонов, в которой клиентский код выбирает шаблон и просит его расширить себя из объекта параметра. Это своего рода заполнение форм.

Мне очень хочется увидеть, что другие испытали по этому поводу. HATEOAS кажется хорошей идеей, если не считать аспектов производительности.

Изменить: наши шаблоны являются частью клиентской библиотеки Java, которую мы написали поверх инфраструктуры Restlet . Клиентская библиотека обрабатывает все детали HTTP-запросов / ответов, HTTP-заголовков, десериализации / сериализации, кодирования GZIP и т. Д. Это делает реальный клиентский код довольно кратким и помогает изолировать его от некоторых изменений на стороне сервера.

Roy Fielding '

17
ответ дан 26 November 2019 в 21:31
поделиться

Выбранный вами веб-браузер является «чистым HATEOAS» -клиентом для всей WWW.

Вопрос, на самом деле, не имеет смысла imo.

-4
ответ дан 26 November 2019 в 21:31
поделиться

На данный момент я создал два клиента, которые обращаются к службам REST. Оба используют исключительно HATEOAS. Я добился огромного успеха, имея возможность обновлять функциональность сервера без обновления клиента.

Я использую xml: base для включения относительных URL-адресов, чтобы уменьшить шум в моих xml-документах. Помимо загрузки изображений и других статических данных, я обычно перехожу по ссылкам только по запросам пользователей, поэтому накладные расходы на производительность ссылок для меня не имеют значения.

На клиентах единственная общая функциональность, которую я чувствовал необходимость создать, - это оболочки вокруг моих типов мультимедиа и класса для управления ссылками.


Обновление:

Кажется, есть два разных способа работы с интерфейсами REST с точки зрения клиента. Во-первых, когда клиент знает, какую информацию он хочет получить, и знает, по каким ссылкам ему нужно пройти, чтобы получить к этой информации. Второй подход полезен, когда пользователь клиентского приложения контролирует, по каким ссылкам следует переходить, и клиент может заранее не знать, какой тип мультимедиа будет возвращен с сервера. Для развлечения я называю эти два типа клиентов, майнер данных и диспетчер, соответственно.

Майнер данных

Например, представьте на мгновение, что API Twitter был на самом деле RESTful, и я хотел написать клиента который будет получать самое последнее сообщение о статусе последнего подписчика конкретного пользователя твиттера.

Предполагая, что я использовал новую замечательную библиотеку Microsoft.Http.HttpClient, и я написал несколько "ReadAs" методы расширения для синтаксического анализа XML, поступающего из twitter API, я предполагаю, что это будет выглядеть примерно так:

var twitterService = HttpClient.Get("http://api.twitter.com").Content.ReadAsTwitterService();

var userLink = twitterService.GetUserLink("DarrelMiller");
var userPage = HttpClient.Get(userLink).Content.ReadAsTwitterUserPage();

var followersLink = userPage.GetFollowersLink();
var followersPage = HttpClient.Get(followersLink).Content.ReadAsFollowersPage();
var followerUserName = followersPage.FirstFollower.UserName;

var followerUserLink = twitterService.GetUserLink(followerUserName);
var followerUserPage = HttpClient.Get(followerUserLink).Content.ReadAsTwitterUserPage();

var followerStatuses = HttpClient.Get(followerUserPage.GetStatusesLink()).Content.ReadAsTwitterUserPage();

var statusMessage = followerStatuses.LastMessage; 

Диспетчер

Чтобы лучше проиллюстрировать этот пример, представьте, что вы реализуете клиент, который отображает генеалогическую информацию. Клиент должен иметь возможность отображать дерево, переходить к информации о конкретном человеке и просматривать связанные изображения. Рассмотрим следующий фрагмент кода:

 void ProcessResponse(HttpResponseMessage response) {
            IResponseController controller;

            switch(response.Content.ContentType) {
                case "vnd.MyCompany.FamilyTree+xml":
                    controller = new FamilyTreeController(response);
                    controller.Execute();
                    break;
                case "vnd.MyCompany.PersonProfile+xml":
                    controller = new PersonProfileController(response);
                    controller.Execute();
                    break;
                case "image/jpeg":
                    controller = new ImageController(response);
                    controller.Execute();
                    break;
            }

        }

Клиентское приложение может использовать полностью общий механизм для перехода по ссылкам и передачи ответа этому методу диспетчеризации. Отсюда оператор switch передает управление определенному классу контроллера, который знает, как интерпретировать и отображать информацию в зависимости от типа носителя.

Очевидно, что в клиентском приложении гораздо больше частей, но это те, которые соответствуют HATEOAS.

9
ответ дан 26 November 2019 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: