Написание клиента для API RESTful (гипермедиа)
Я читаю "настоящие" API RESTful уже несколько дней, и я думаю, что я близок к тому, чтобы разобраться в этом.
Но одна из вещей, которые я натыкаюсь, - это то, что я даже не могу представить, как написать клиент для "реального" гипермедиа API:
-
Большинство примеров, которые я прочитал, говорят о браузерах и пауках, но это не особенно полезно: один из них направлен на человека и "умный", другой - немой и "случайный". Как бы то ни было, у меня создается впечатление, что вам нужно будет изучить ИИ, чтобы заставить клиента работать.
-
Одна вещь, которая не ясна для меня, заключается в том, как клиент знает, какой глагол использовать на какой-либо данной ссылке? Является ли это подразумеваемым в "rel" типе uri? Альтернатива (чтение здесь), кажется, использует xhtml и имеет клиента, который может анализировать и публиковать формы.
-
Насколько вероятно, что ссылка изменится, но не маршрут к ссылке?
В большинстве примеров вы видите вокруг, маршрут и ссылка одинаковы:
например. если я хочу настроить клиента, который вернет мне список тортов из Toni Cake Shop:
http://tonis.com
{ link: { type : "cakes" ; uri : "http://tonis.com/cakes" } }
Что происходит, когда Тони становится продуктовым магазином Тони, а ссылка становится http://tonis.com/desserts/cakes
?
Сохраняем ли начальную ссылку cakes
в корне, для обратной совместимости? А если нет, то как мы делаем "перенаправление" для бедного маленького агента, которому было сказано "идти корнем, искать пирожные"?
Что мне не хватает?
Ответы
Ответ 1
@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 поставщика торта, он продолжит работу, это означает, что клиент все еще понимает семантику вашего типа медиа.
P.S.
Ответ 2
Хорошо, я тоже не эксперт REST, я недавно читал много связанных материалов, поэтому то, что я собираюсь писать, это не мой опыт или мнение, а резюме того, что я читал, особенно, книга REST In Practice.
Прежде всего, вы не можете избежать первоначального соглашения между клиентом и сервером, цель REST состоит в том, чтобы заставить их согласиться с минимальным количеством вещей, которые имеют отношение к обоим из них, и пусть каждая сторона заботится о них собственные вещи сами. Например, клиент не должен заботиться о макете ссылок или о том, как данные хранятся на сервере, а серверу не нужно заботиться о состоянии клиента. То, что они соглашаются заранее (то есть до начала взаимодействия), - это то, что назвали авторы книги "Domain Application Protocol" (DAP).
Важная вещь в DAP заключается в том, что он является работоспособным, хотя сам HTTP не является (поскольку любое взаимодействие с клиентом и сервисом имеет состояние, по крайней мере, начинается и заканчивается). Это состояние можно описать в терминах "Что клиент может/может/должен делать дальше": "Я начал использовать службу, что теперь? Хорошо, я могу искать элементы. Поиск этого элемента, что дальше?, Я могу заказать то-то и то... и т.д."
Определение типа содержимого Hypermedia позволяет обрабатывать как обмен данными, так и состояние взаимодействия. Как я уже упоминал, состояние описывается с точки зрения возможных действий, и, как это происходит из "Ресурса" в REST, все действия описываются с точки зрения доступных ресурсов. Я думаю, вы видели акроним "HATEOAS (Hypermedia как двигатель состояния приложения), так что, по-видимому, это означает.
Итак, чтобы взаимодействовать с сервисом, клиент использует формат гипермедиа, который они оба понимают, который может быть стандартным, доморощенным или смесью тех (например, на основе XML/XHTML). В дополнение к этому, они также должны использовать протокол, который, скорее всего, HTTP, но поскольку некоторые детали не указаны в стандарте, должны быть некоторые идиомы его использования, такие как "Использовать POST для создания ресурса и PUT для обновления", Кроме того, такой протокол будет включать точки входа службы (опять же, с точки зрения доступных ресурсов).
Эти три аспекта полностью определяют протокол домена. В частности, клиент не должен знать какие-либо внутренние ссылки до того, как он начнет использовать службу или запомнит их после завершения взаимодействия. В результате любые изменения во внутренней навигации, такие как переименование /cakes
в /f5d96b5c
, не будут влиять на клиента, как только он будет придерживаться первоначального соглашения и войдет в магазин через входную дверь.
Ответ 3
После просмотра этого видеозаписей Джона Мура у меня было намного лучшее понимание гиперссылки apis http://oredev.org/2010/sessions/hypermedia-apis