在自定义媒体类型中创建超媒体链接

时间:2009-08-13 13:30:47

标签: xml http rest media-type

我目前正在为RESTful api创建一组自定义媒体类型(例如application / vnd.mycompany.foo + xml),我试图找出两种不同的暴露超媒体链接方式的优缺点。 / p>

如果我首先考虑其他媒体类型可能最好的起点是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属性,然后是使用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>

我要问的问题是,何时使用具有关系的链接元素更有意义,何时将属性添加到现有元素更有意义。

e.g。 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 个答案:

答案 0 :(得分:3)

我相信在语义上你的两个Atom例子是等价的。在Atom规范中有一些地方,没有关系的链接被认为是默认链接(无论它们是“自我”还是“源”,我都不记得)。我个人最喜欢第二个AtomPub示例,因为Atom Entry中的链接元素(一般处理Atom时最常用的对象)定义了具有关系的链接元素,并在类别,集合和工作空间中使用相同的模式元素意味着它更容易解析,而不需要知道很多特殊条件。

我忽略了第一个HTML示例,因为原始HTML从未真正用于Atom的方式进行机器通信,因此(IMO)在语义上理解HTML更加困难,并且需要处理大量特定规则来处理每个HTML不同种类的标签。

答案 1 :(得分:2)

我对XHTML 2的看法是every element could have a link

为什么不利用XLink启用相同的功能?这样,无需选择。

答案 2 :(得分:1)

这是一个有趣的问题。看待它的一种方法是 将链接区分为链接到相关资源的“信息”链接, 客户可能(或可能不)想要关注以获取更多信息 (就像atompub中的<categories>元素一样。)

另一方面是“定义”协议的链接, 即,通过状态变化的顺序“引导”客户 (例如,在Atompub的情况下发布/编辑/删除,或在购物系统中订购/审查/支付)构成实际协议的资源(如 <link rel="edit">)。

Starbucks article中,作者通过以下方式扩展了整个想法 为状态变化定义(假设的)模式。他们使用的是<next rel="schema url" uri="uri for next resource state">而不是Atom的 <link rel="..." href="...">,但总的想法是一样的。

当然,有人可能会说,任何链接代表一个州 为客户改变。但我认为这种区别是有道理的。