我目前正在为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"/>
通常情况下,在写这个问题时,答案似乎显而易见。必需的链接作为属性公开,可选的链接作为元素公开。但是,我会非常有兴趣听取其他人对于他们认为如何表示链接的看法。
答案 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="...">
,但总的想法是一样的。
当然,有人可能会说,任何链接代表一个州 为客户改变。但我认为这种区别是有道理的。