2016-09-12 8 views
1

Я понимаю, что HATEOAS представляет состояние приложений, отправив все действия, которые могут быть выполнены в тот момент времени в приложении в качестве ответа (HAL, JSON-LD и т. Д.).Runtime открытия гипермедиа HATEOAS?

Например, просмотр ресурса учетной записи банка может позволить вам внести, снять или закрыть учетную запись (ОПЦИИ, которые могут возвращать UPDATE и DELETE).

С точки зрения обнаружения во время выполнения этих ссылок (по потребляющему клиенту), как это можно сделать?

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

Я понимаю, что отправка запросов OPTIONS - это способ определить текущее состояние ресурса и что вы можете сделать дальше, но для того, чтобы обнаружить фактические URI для использования - будут ли они просто жестко закодированы как URI COOL?

ответ

0

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

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

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

Для начала ознакомьтесь с. How To GET a Cup of Coffee.

Гиперссылки в документах, обслуживаемых RESTBucks, предназначены для помощи клиенту в согласовании протокола RESTBucks; предположение, что клиент уже понимает, что протокол выпекается в модель. Другими словами, клиент уже понимает, что переговоры по протоколу позволят ему достичь goal.

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

+0

По существу, клиент по-прежнему должен быть привязан к схеме, отправленной с сервера, поскольку эта схема является протокалом? –

+0

Иш. Клиент должен понимать тип носителя (т. Е. Как обрабатывать байты), чтобы вообще общаться с сервером (здесь может помочь согласование содержимого). Кроме того, у вас есть тот факт, что клиент должен понимать состояние приложения - другими словами, как использовать ссылки для продвижения к своей цели. Сервер предоставляет ссылки как представление вариантов, доступных клиенту; клиенту не нужно распознавать все ссылки, но он не может продвинуться дальше, если он не распознает ссылки, которые обеспечивают прогресс. – VoiceOfUnreason

+0

Если в этом случае клиент является просто Java-приложением, вызывающим службу через HTTP, было бы простым примером программирования Java-приложения, чтобы понять, что делать с каждой ссылкой на каждом этапе состояния ресурсов. Что я тогда не понимаю, так это то, что это совсем не связано? На этом этапе клиент должен быть подключен к схеме. Однако я думал, что использование HATEOS означает, что сервер может изменить свою схему в любое время, не нарушая работу клиента. –

2

Как и @VoicesOfUnreason, в URI HATEOAS можно обнаружить (и не задокументировать), чтобы их можно было изменить. То есть, если они не являются самыми точками входа в вашу систему (Cool URIs, единственные, которые могут быть жестко закодированы клиентами) - и у вас не должно быть слишком многих из них, если вы хотите, чтобы развилась остальная часть вашей система URI системы в будущем. Это фактически одна из самых useful функций REST.

Для оставшихся не-Cool URI они могут быть изменены с течением времени, и ваша документация по API должна содержать информацию о том, что они должны быть обнаружены во время выполнения через обход гипермедиа.

Глядя на Richardson's Maturity Model (level 3), это будет где ссылки вступают в игру. Например, с верхнего уровня, say/api/version (/ 1), вы обнаружите, что есть ссылка на группы. Вот как это может выглядеть в инструменте, как HAL Browser:

Корень:

{ 
    "_links": { 
    "self": { 
     "href": "/api/root" 
    }, 
    "api:group-add": { 
     "href": "http://apiname:port/api/group" 
    }, 
    "api:group-search": { 
     "href": "http://apiname:port/api/group?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}" 
    }, 
    "api:group-by-id": { 
     "href": "http://apiname:port/api/group/id" (OR "href": "http://apiname:port/api/group?id={id}") 
    } 
    } 
} 

Надстройка будет просто POST к этой конечной точке, и тогда вам придется 2 метода GET.

GET /api/group?pageNumber=0&pageSize=20&sort=asc

, которые могли бы вернуть что-то вроде этого:

{ 
    "groups": [ 
     { 
     "id": 123, 
     "name": "Test Group" 
     }, 
     { 
     "id": 134, 
     "name": "Tennis squad" 
     } 
    ] 
} 

Затем, когда вы перейти к определенной группе (например # 123):

{ 
    "Id" : 123, 
    "Name" : "test", 
    "_links": { 
    "self": { 
     "href": "/api/group/1" (OR "/api/group?id=1") 
    }, 
    "edit": { 
     "href": "http://apiname:port/api/group/1" 
    }, 
    "api:delete": { 
     "href": "http://apiname:port/api/group/1" 
    }, 
    "api:items-query": { 
     "href": "http://apiname:port/api/bonus?groupId=1" 
    } 
    } 
} 

Здесь редактировать бы просто введите PUT, а затем вам понадобится DELETE (см. уровень 2 REST в той же самой ссылке), так как для элементов вы, вероятно, знаете лучше всего, если они просто свойство, или другой конец т; вы можете включить их для возврата в том же вызове, который извлекает группу.

Преимущество здесь состояло в том, что клиенту нужно было бы знать только имя отношения (ссылка) (очевидно, помимо структуры/свойств ресурса), тогда как сервер будет в основном свободным изменять URL-адрес отношения (и ресурса) ,

+0

Благодарим за это, с точки зрения гипермедийного обхода, какие методы вы бы использовали для этого? Можете ли вы предоставить образцы кода, библиотеки или фреймворки? –

+0

@JacobClark Я отредактировал свой ответ, чтобы немного рассказать о некоторых деталях. –

+0

Итак, если я правильно вас понимаю - здесь нужно понять структуру ресурса (ака как добраться до свойства api: delete) просто для того, чтобы получить ссылку, так что в случае изменения сервера URL (ресурса) клиенту не нужно ничего делать, поскольку он достигает ссылки, остался прежним. Таким образом, клиенту требуется меньше изменений при обновлении того, как моделируется взаимосвязь между данными. В теории тогда - если бы я хотел изменить всю структуру отношений/ресурсов, я мог бы сделать это с минимальным воздействием на моих клиентов? –

Смежные вопросы