Connectedness & HATEOAS

Сказано, что в четко определенной УСПОКОИТЕЛЬНОЙ системе, клиенты только должны знать корневой URI или немного известных URIs, и клиент должен обнаружить, что все другие ссылки через них подписывают URIs. Я действительно понимаю преимущества (отделенные клиенты) от этого подхода, но оборотная сторона для меня - то, что клиент должен обнаружить ссылки каждый раз, когда он пробует доступ что-то т.е., учитывая следующую иерархию ресурсов:

/collection1
collection1
  |-sub1
    |-sub1sub1
 |-sub1sub1sub1
         |-sub1sub1sub1sub1
    |-sub1sub2
  |-sub2
    |-sub2sub1
    |-sub2sub2
  |-sub3
    |-sub3sub1
    |-sub3sub2

Если мы следуем, "Клиент только должен знать корневой URI" подход, то клиент должен только знать о корневом URI т.е./collection1 выше, и остальная часть URIs должна быть обнаружена клиентами через ссылки гиперсреды. Я нахожу это громоздким, потому что каждый раз клиент должен сделать ПОЛУЧЕНИЕ, сказать относительно sub1sub1sub1sub1, клиент должен сначала сделать Получение на/collection1 и переходить ссылке, определенной в возвращенном представлении, и затем сделать еще несколько Входят в sub ресурсы для достижения желаемого ресурса? или мое понимание о связности полностью неправильно?

С наилучшими пожеланиями, Suresh

11
задан Paul Sonier 2 June 2011 в 18:09
поделиться

3 ответа

Вы столкнетесь с этим несоответствием, когда попытаетесь создать REST api, который не соответствует потоку пользовательского агента, который использует API.

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

Если вы попытаетесь смоделировать свой REST API как своего рода связанный репозиторий данных, а пользовательский интерфейс клиента - как независимый набор переходов, то HATEOAS покажется вам довольно болезненным.

6
ответ дан 3 December 2019 в 10:03
поделиться

Я не думаю, что это строгое требование. Насколько я понимаю, это законно для клиента - получить прямой доступ к ресурсам и начать оттуда. Главное, чтобы вы не делали этого для переходов состояний, то есть не переходили автоматически к /foo2 после работы с /foo1 и так далее. Получение /products/1234 изначально для его редактирования кажется совершенно нормальным. Сервер всегда может вернуть, скажем, перенаправление на /shop/products/1234, чтобы сохранить обратную совместимость (что желательно для поисковых систем, закладок и внешних ссылок).

0
ответ дан 3 December 2019 в 10:03
поделиться

Да, это правильно, что клиентское приложение должно обходить ссылки, но как только оно обнаружило ресурс, нет ничего плохого в том, чтобы сохранить ссылку на этот ресурс и использовать его в течение более длительного времени, чем один запрос. Если у вашего клиента есть возможность запоминать что-то надолго, он может это делать.

Рассмотрим, как веб-браузер хранит свои закладки. У вас, вероятно, есть десять или сто закладок в браузере, и вы, вероятно, нашли некоторые из них глубоко в иерархии страниц, но браузер послушно запоминает их, не требуя помнить путь, который он прошел, чтобы найти их.

Более богатое клиентское приложение могло бы запомнить URI sub1sub1sub1sub1sub1 и использовать его повторно, если он все еще работает. Вполне вероятно, что он по-прежнему представляет то же самое (так и должно быть). Если он больше не существует или не работает по какой-либо другой клиентской причине (4xx), вы можете проследить свои шаги, чтобы найти подходящую замену.

И, конечно, то, что сказал Даррел Миллер :-)

4
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: