Написание клиента для API RESTful (гипермедиа) - PullRequest
10 голосов
/ 09 марта 2012

Я уже несколько дней читаю «настоящие» API-интерфейсы RESTful, и я думаю Я близок к тому, чтобы понять, что это такое.

Но одна вещь, на которую я наткнулся, это то, что я даже не могу представить, как можно написать клиент для «настоящего» гипермедиа API:

  1. Большинство примеров, которые я читал, говорят о браузерах и пауках, но это не особенно полезно: один из них ориентирован на человека и «интеллектуален», другой - глуп и «случайен».Как бы то ни было, у меня создается впечатление, что вам нужно изучить ИИ, чтобы заставить клиента работать.

  2. Одна вещь, которая мне не ясна, это то, как клиент знаеткакой глагол использовать в любой данной ссылке?Это подразумевается в типе URI «rel»?Альтернатива (здесь читается ), по-видимому, использует xhtml и имеет клиент, который может анализировать и публиковать формы.

  3. Насколько вероятно, что ссылка изменится,а не маршрут к ссылке?В большинстве примеров, которые вы видите вокруг, маршрут и ссылка одинаковы:

например.если я хочу настроить клиента, который будет возвращать мне список тортов из кондитерской Тони:

http://tonis.com
{ link: { type : "cakes" ; uri : "http://tonis.com/cakes" } }

Что произойдет, когда Тони станет Продовольственным магазином Тони, и ссылка станет http://tonis.com/desserts/cakes?

Сохраняем ли мы исходную ссылку cakes в корне для обратной совместимости?И если нет, то как нам сделать «перенаправление» для бедного маленького агента, которому сказали «иди в корень, ищи пироги»?

Чего мне не хватает?

Ответы [ 3 ]

8 голосов
/ 09 марта 2012

Хорошо, я тоже не эксперт по REST, в последнее время я много читаю по теме, так что я собираюсь написать не мой опыт или мнение, а скорее краткое изложение того, что я прочитал, особенно ОТДЫХ На практике книга.

Прежде всего, вы не можете избежать первоначального соглашения между клиентом и сервером, цель REST - заставить их договориться о самом минимуме вещей, которые имеют отношение к ним обоим, и позволить каждой стороне заботиться о свои собственные вещи сами. Например, клиент не должен заботиться о расположении ссылок или о том, как данные хранятся на сервере, а сервер не должен заботиться о состоянии клиента. То, о чем они заранее договариваются (т.е. до начала взаимодействия), - это то, что авторы вышеупомянутой книги называют «Протоколом доменного приложения» (DAP).

Важной особенностью DAP является то, что он является состоящим из состояний, хотя сам HTTP отсутствует (поскольку любое взаимодействие клиент-сервис имеет состояние, по крайней мере, начало и конец). Это состояние можно описать в терминах «Что клиент может / может / должен делать дальше»: «Я начал пользоваться сервисом, что теперь? Хорошо, я могу искать элементы. Искать этот элемент, что дальше? Хорошо Я могу заказать то и это ... и т. Д. "

Определение типа контента Hypermedia позволяет обрабатывать как обмен данными, так и состояние взаимодействия. Как я уже упоминал, состояние описывается в терминах возможных действий, и, как следует из «Ресурса» в REST, все действия описываются в терминах доступных ресурсов. Полагаю, вы видели аббревиатуру «HATEOAS» (гипермедиа как движок состояния приложения), так что это, по-видимому, означает.

Таким образом, для взаимодействия со службой клиент использует гипермедиа формат, который они оба понимают, который может быть стандартным, доморощенным или их комбинацией (например, на основе XML / XHTML). В дополнение к этому, они также должны совместно использовать протокол, который, скорее всего, HTTP, но поскольку некоторые детали не включены в стандарт, должны быть некоторые идиомы его использования, такие как «Использование POST для создания ресурса и PUT для обновления» , Кроме того, такой протокол будет включать точки входа службы (опять же, с точки зрения доступных ресурсов).

Эти три аспекта полностью определяют протокол домена. В частности, клиент не должен знать какие-либо внутренние ссылки до того, как он начнет использовать сервис, или запоминать их после завершения взаимодействия. В результате любые изменения во внутренней навигации, такие как переименование /cakes в /f5d96b5c, не затронут клиента, как только он соблюдает первоначальное соглашение и входит в магазин через парадную дверь.

7 голосов
/ 01 июня 2012

@ Benjol

Вы должны избегать программирования клиентов для определенных URI.Когда вы описываете ссылку, главное значение имеет ее значение, а не сам URI.Вы можете изменить URI в любое время, но это не должно нарушить работу вашего клиента.

Я бы изменил ваш пример следующим образом:

{"link": {
  "rel":   "collection http://relations.your-service.com/cakes",
  "href":  "http://tonis.com/cakes",
  "title": "List of cakes",
  "type":  "application/vnd.yourformat+json"
}}

, если есть клиент, который использует ваш сервис, он должен понимать:

В этом случае клиент может просто разыменовать адрес, указанный атрибутом "href", и отобразить список тортов.Позже, если вы измените URI-клиент поставщика списка тортов, он продолжит работать, это означает, что клиент по-прежнему понимает семантику вашего типа мультимедиа.

PS

0 голосов
/ 23 февраля 2014

После просмотра этого видео о выступлении Джона Мура у меня появилось намного лучшее понимание гиперплазированного apis http://oredev.org/2010/sessions/hypermedia-apis

...