Создание гиперссылок в пользовательском медиа-типе
В настоящее время я создаю набор пользовательских типов мультимедиа для API RESTful (например, application/vnd.mycompany.foo+xml) и пытаюсь определить плюсы и минусы двух разных способов раскрытия гиперссылок.
Если я сначала рассмотрим, что делают другие типы мультимедиа, возможно, лучше всего начать с HTML. HTML позволяет мне создавать ссылки, такие как:
<image src="http://example.com/image.gif"/>
<a href="http://example.com/page.html"/>
<form action="http://example.com/page.html"/>
<link rel="stylesheet" type="text/css" href="theme.css" />
Интересно то, что в некоторых случаях есть некоторые специальные теги, которые имеют атрибут url, а затем есть общий тег link, который использует атрибут rel для определения отношения.
В AtomPub есть также несколько способов, которыми ресурсы связаны друг с другом
<collection href="http://example.org/blog/main" >
<atom:title>My Blog Entries</atom:title>
<categories href="http://example.com/cats/forMain.cats" />
</collection>
<atom:category scheme="http://example.org/extra-cats/" term="joke" />
<atom:entry>
<link rel="edit" href="http://example.org/edit/first-post.atom"/>
</atom:entry>
Вопрос, который я задаю, заключается в том, когда имеет больше смысла использовать элемент ссылки со связью, а когда имеет смысл добавить атрибут к существующему элементу.
например, ссылки AtomPub могли быть сделаны
<collection>
<link rel="source" href="http://example.org/blog/main"/>
<atom:title>My Blog Entries</atom:title>
<categories>
<link rel="source" href="http://example.com/cats/forMain.cats"/>
</categories>
</collection>
<atom:category term="joke">
<link rel="scheme" href="http://example.org/extra-cats/"/>
<atom:category>
<atom:entry edit="http://example.org/edit/first-post.atom"/>
Как это часто бывает, при написании этого вопроса ответ кажется очевидным. Обязательные ссылки отображаются как атрибуты, а необязательные - как элементы. Однако мне было бы очень интересно услышать мнение других людей о том, как, по их мнению, должны быть представлены ссылки.
3 ответа
Что мне понравилось в XHTML 2, так это то, что каждый элемент мог иметь ссылку.
Почему бы не использовать XLink для включения той же функциональности? Таким образом, нет необходимости выбирать.
Я считаю, что семантически ваши два примера Atom эквивалентны. В спецификации Atom есть несколько мест, где ссылка без отношения считается ссылкой по умолчанию (независимо от того, называют ли они "я" или "источник", я не помню). Лично мне больше нравится второй пример AtomPub, потому что элементы ссылки в записи Atom (которая является наиболее часто используемым объектом при работе с Atom в целом) определяют элементы ссылки с отношениями и используют одну и ту же схему в категории, коллекции и рабочей области. Элемент означает, что анализ легче без необходимости знать много специальных условий.
Я как бы игнорирую первый пример HTML, потому что оригинальный HTML никогда не предназначался для машинного взаимодействия в том виде, в каком он есть в Atom, и поэтому (IMO) семантическое понимание HTML является более сложным и сводит на нет множество конкретных правил для обработки различных видов. тег.
Это интересный вопрос. Один из способов взглянуть на это - разделить ссылки на "информационные" ссылки, которые ссылаются на связанные ресурсы, которые клиент может (или не может) хотеть использовать, чтобы получить больше информации (например, <categories>
элемент в atompub).
С другой стороны, есть ссылки, которые "определяют" протокол, то есть "направляют" клиента через последовательность изменений состояния (например, публикация / редактирование / удаление в случае Atompub или заказ / просмотр / оплата в системе покупок).) ресурса, который составляет фактический протокол (например,<link rel="edit">
).
В статье Starbucks авторы расширяют всю идею, определяя (гипотетическую) схему для изменений состояния. Они используют <next
rel="schema url" uri="uri for next resource state">
вместо атома<link rel="..." href="...">
, но общая идея та же самая.
Конечно, можно утверждать, что переход по любой ссылке представляет изменение состояния для клиента. Но я думаю, что это различие имеет смысл.