假设我有两个顶级资源Foo
和Bar
。现在Foo
需要链接到一些Bar
。在一个Java类,这可能是这个样子:REST API设计:链接资源
public class Foo {
Set<Bar> bars;
}
public class Bar { … }
我想的Foo
XML表示形状的东西是这样的:
GET /foos/1
<foo>
…
<atom:link rel="self" href="/foos/1" />
<atom:link rel="bars" href="/foos/1/bars" />
</foo>
所以我几乎都暴露Bar
分配至Foo
作为嵌套资源。这意味着Bar
资源具有单独的生命周期(聚合而不是合成)。然后,嵌套的资源,就有可能暴露所有链接Bar
是这样的:
GET /foos/1/bars
<bars>
<atom:link rel="bar" href="/foos/1/bars/1" />
<atom:link rel="bar" href="/foos/1/bars/2" />
</bars>
Alteratively我可以内嵌在集合中的元素<foo>
前期。不过,我仍然坚持一些问题:虽然这使我可以通过触发DELETE
请求来很好地从Foo
中删除Bar
。 /foos/1/bars/1
但是如何将一个Bar
分配给Foo
呢?假设客户端将访问/bars
获得:
GET /bars
<bars>
<bar>
…
<atom:link rel="self" href="/bars/4711" />
</bar>
</bars>
,并决定它要分配给/bars/1
/foo/1/bars
。我正在考虑POST
请求/foo/1/bars
,但不确定要实际提交的内容。 A link
元素指向Bar
资源如下?
POST /foos/1/bars
<atom:link href="/bars/4711" />
这似乎相当好为客户仍然不需要创建URL,我们仍然满足REST约束。但是,对于POST
指向服务器的链接感觉有点奇怪。这种情况有更好的解决方案吗?
我会毫不犹豫地发布一个链接来建立两个资源之间的关系。有些人认为你应该检索资源,然后POST自我描述,但我不相信这是必要的。 – 2012-01-11 12:20:51
这就是我也觉得,因为你是a)创造不必要的健忘和b)实际上并不需要在服务器端实际创建链接的整个转发。 – 2012-01-11 19:59:32