Сказано, что в четко определенной УСПОКОИТЕЛЬНОЙ системе, клиенты только должны знать корневой URI или немного известных URIs, и клиент должен обнаружить, что все другие ссылки через них подписывают URIs. Я действительно понимаю преимущества (отделенные клиенты) от этого подхода, но оборотная сторона для меня - то, что клиент должен обнаружить ссылки каждый раз, когда он пробует доступ что-то т.е., учитывая следующую иерархию ресурсов:
/collection1
collection1
|-sub1
|-sub1sub1
|-sub1sub1sub1
|-sub1sub1sub1sub1
|-sub1sub2
|-sub2
|-sub2sub1
|-sub2sub2
|-sub3
|-sub3sub1
|-sub3sub2
Если мы следуем, "Клиент только должен знать корневой URI" подход, то клиент должен только знать о корневом URI т.е./collection1 выше, и остальная часть URIs должна быть обнаружена клиентами через ссылки гиперсреды. Я нахожу это громоздким, потому что каждый раз клиент должен сделать ПОЛУЧЕНИЕ, сказать относительно sub1sub1sub1sub1, клиент должен сначала сделать Получение на/collection1 и переходить ссылке, определенной в возвращенном представлении, и затем сделать еще несколько Входят в sub ресурсы для достижения желаемого ресурса? или мое понимание о связности полностью неправильно?
С наилучшими пожеланиями, Suresh
Вы столкнетесь с этим несоответствием, когда попытаетесь создать REST api, который не соответствует потоку пользовательского агента, который использует API.
Учтите, что когда вы запускаете клиентское приложение, пользователю всегда предоставляется какой-то начальный экран. Если вы сопоставите содержимое и параметры на этом экране с корневым представлением, тогда доступные ссылки и желаемые переходы будут точно соответствовать. Когда пользователь выбирает параметры на экране, вы можете перейти к другим представлениям, и пользовательский интерфейс клиента должен быть обновлен, чтобы отразить новое представление.
Если вы попытаетесь смоделировать свой REST API как своего рода связанный репозиторий данных, а пользовательский интерфейс клиента - как независимый набор переходов, то HATEOAS покажется вам довольно болезненным.
Я не думаю, что это строгое требование. Насколько я понимаю, это законно для клиента - получить прямой доступ к ресурсам и начать оттуда. Главное, чтобы вы не делали этого для переходов состояний, то есть не переходили автоматически к /foo2 после работы с /foo1 и так далее. Получение /products/1234 изначально для его редактирования кажется совершенно нормальным. Сервер всегда может вернуть, скажем, перенаправление на /shop/products/1234, чтобы сохранить обратную совместимость (что желательно для поисковых систем, закладок и внешних ссылок).
Да, это правильно, что клиентское приложение должно обходить ссылки, но как только оно обнаружило ресурс, нет ничего плохого в том, чтобы сохранить ссылку на этот ресурс и использовать его в течение более длительного времени, чем один запрос. Если у вашего клиента есть возможность запоминать что-то надолго, он может это делать.
Рассмотрим, как веб-браузер хранит свои закладки. У вас, вероятно, есть десять или сто закладок в браузере, и вы, вероятно, нашли некоторые из них глубоко в иерархии страниц, но браузер послушно запоминает их, не требуя помнить путь, который он прошел, чтобы найти их.
Более богатое клиентское приложение могло бы запомнить URI sub1sub1sub1sub1sub1 и использовать его повторно, если он все еще работает. Вполне вероятно, что он по-прежнему представляет то же самое (так и должно быть). Если он больше не существует или не работает по какой-либо другой клиентской причине (4xx), вы можете проследить свои шаги, чтобы найти подходящую замену.
И, конечно, то, что сказал Даррел Миллер :-)