Остальные гипермедиа 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 ответа:
Веб-браузер - это клиент без состояния, наиболее знакомый многим пользователям. То, что вы просите, известно как 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. Его модель поддерживает это из коробки. Я считаю, что большинство других фреймворков также должны поддерживать этот тип рабочего процесса.
Вы можете взглянуть на эти магистральные конкретные ссылки как примеры:
Надеюсь, что это поможет