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

8
我目前正在为RESTful API创建一组自定义媒体类型(例如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属性,然后使用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"/>

通常情况下,在写这个问题时,答案似乎显而易见。所需的链接作为属性暴露,可选的链接作为元素呈现。但是,我非常想听听其他人对于链接应该如何表示的看法。


并不完全涉及到你的问题,但你可以而且应该在锚标签上使用'rel' 属性。 - aehlke
3个回答

3
我认为在语义上,您的两个Atom示例是等价的。在Atom规范中,有一些地方将没有关系的链接视为默认链接(无论它们称之为“self”还是“source”,我不记得了)。就个人而言,我最喜欢第二个AtomPub示例,因为Atom条目中的链接元素(在处理Atom时最常用的对象)定义了具有关系的链接元素,并且在类别、集合和工作区元素中使用相同的模式意味着更容易解析,而无需知道很多特殊条件。
我有点忽略第一个HTML示例,因为原始HTML并不真正适用于Atom这样的机器通信,因此(依我看来)理解HTML的语义更加困难,需要处理每种不同标签的许多特定规则。

@Gandalf:你指出了对我来说非常重要的一点。如果始终使用<link...>习语,您不需要任何特殊的例外,可以使用相同的代码处理所有内容:您只需要解释关系和内容类型,理论上可以很好地通用化。 - jkp

2

1
我以前看过XLink,但被事实打击了,因为共识似乎是没有人有兴趣使用它。然而,第二次看时,它似乎解决了我所有的问题,所以为什么要浪费时间重新发明呢! - Darrel Miller

1

这是一个有趣的问题。一种看待它的方式是将链接区分为“信息性”链接和“定义”协议的链接。

“信息性”链接指向相关资源,客户端可能会(也可能不会)想要跟随以获取更多信息(例如Atompub中的<categories>元素)。

另一方面,“定义”协议的链接则“引导”客户端通过状态变化序列(例如Atompub中的发布/编辑/删除,或购物系统中的下单/审核/支付)来构成实际协议(例如<link rel="edit">)。

星巴克文章中,作者通过定义(假设的)状态变化模式来扩展整个想法。他们使用<next rel="schema url" uri="uri for next resource state">而不是Atom的<link rel="..." href="...">,但总体思路是相同的。

当然,有人可能会争辩说跟随任何链接都代表了客户端的状态变化。但我认为这种区分是有意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接