Как и @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-адрес отношения (и ресурса) ,
По существу, клиент по-прежнему должен быть привязан к схеме, отправленной с сервера, поскольку эта схема является протокалом? –
Иш. Клиент должен понимать тип носителя (т. Е. Как обрабатывать байты), чтобы вообще общаться с сервером (здесь может помочь согласование содержимого). Кроме того, у вас есть тот факт, что клиент должен понимать состояние приложения - другими словами, как использовать ссылки для продвижения к своей цели. Сервер предоставляет ссылки как представление вариантов, доступных клиенту; клиенту не нужно распознавать все ссылки, но он не может продвинуться дальше, если он не распознает ссылки, которые обеспечивают прогресс. – VoiceOfUnreason
Если в этом случае клиент является просто Java-приложением, вызывающим службу через HTTP, было бы простым примером программирования Java-приложения, чтобы понять, что делать с каждой ссылкой на каждом этапе состояния ресурсов. Что я тогда не понимаю, так это то, что это совсем не связано? На этом этапе клиент должен быть подключен к схеме. Однако я думал, что использование HATEOS означает, что сервер может изменить свою схему в любое время, не нарушая работу клиента. –