Остальные гипермедиа API-интерфейс - навигация с клиентом без гражданства


Простой вопрос: если я создаю клиент без состояния, который "меняет страницу" между запросами, как я правильно использую API гипермедиа?

Ключевым моментом, конечно, является то, что клиент не должен создавать URL-адреса. Если бы мы, например, собирали коллекцию какого-либо вида (скажем, фрукты), каждая запись коллекции содержала бы URL-адрес для ссылки на отдельный фруктовый ресурс в API. Отличный.
[ { "name": "Apple", "url": ".../fruits/15" } ]

Однако в моем клиенте, после представления списка фруктов, я желаю чтобы связать список с другой начальной страницей с подробной информацией о фрукте. Такая страница подробностей, конечно,должна иметь закладку и т. д. Точная структура front-end URL, как я понимаю, философски мало волнует, но она представляет практический интерес для вопроса ниже.

<a href="?">Apple</a>

Таким образом, при загрузке страницы сведений о фруктах возникает вопрос: как клиент, не имеющий текущего контекста, решает, какой URL API получить?

/my/frontend/stuff/fruits/{?}

А теперь что: о?

Решение что изначально приходит на ум, так это наличие шаблона URL-адреса 'item' в ответе коллекции и использование в нем именованных параметров для построения URL-адреса страницы. Затем страница сведений запрашивает API для восстановления того же URL-адреса "элемента" и имплантирует параметр(Ы), который был передан. Это не кажется идеальным, однако оно достигает желаемой развязки.

Заранее благодарю.

2 3

2 ответа:

Веб-браузер - это клиент без состояния, наиболее знакомый многим пользователям. То, что вы просите, известно как URI templating и поддерживается различными форматами гипермедиа. Например, в HTML:

<form action="/api/fruits" method="GET">
  <input type="number" name="id" value="1" min="1">
  <button type="submit">Get Fruit</button>
<form>

, Конечно, генерирует запросы GET к URI /api/fruits?id=1 при отправке.

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

Конечно, в HTML из-за плохой шаблонизации, мы должны перечислять каждый желаемый URI и разбивать длинные списки на страницы:

<a href="/api/fruits/1/">Apple</a>
<a href="/api/fruits/2/">Banana</a>
<a href="/api/fruits/3/">Citrus</a>
...
<a href="/api/fruits/?page=2" rel="next">Page 2</a>

Честно говоря, если пользователи собираются напрямую вводить идентификаторы, вы, вероятно, должны разрешить параметры HTML и строки запроса тоже. Это поможет сторонним разработчикам клиентов, когда они строят против вашего API, и это доступность поможет если вам когда-нибудь понадобится отлаживать с конечными пользователями. Просто укажите им на URL-адрес и спросите: "это работает, если вы идете сюда?"

Если я правильно понимаю проблему, в рабочем процессе есть два шага:

Шаг-1: Клиент-GET (/api/fruits/)

  • возвращено: [{"name": "Apple", "Id" : 1 }, {...}]

Шаг 2: Клиент-GET (/api / fruits/1/), GET (/api / fruits/2/), ...

  • детали каждого плода возвращаются

Клиент должен уже знать" корневой "URL-адрес -" / api / fruits/", чтобы получить список в шаге-1. Для того чтобы получить индивидуальные детали плода как в шаге-2, клиент связывает "корень" URL - адрес "/по API/фрукты/" и "код" возвращается на Шаг 1.

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

Вы можете взглянуть на эти магистральные конкретные ссылки как примеры:

Надеюсь, что это поможет