假设我有两个顶级资源 Foo
和 Bar
.现在Foo
需要链接一些Bar
.在 Java 类中,这可能如下所示:
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>
或者,我可以在
<foo>
中内联集合元素前期。但是我仍然有一些问题:虽然这让我可以很好地删除 Bar
来自 Foo
通过触发 DELETE
请求例如/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
但不确定实际提交什么。一个 link
元素指向 Bar
资源如下?POST /foos/1/bars
<atom:link href="/bars/4711" />
这看起来很正常,因为客户端仍然不需要创建 URL,我们仍然满足 REST 约束。不过对
POST
感觉有点奇怪链接到服务器。这种情况有更好的解决方案吗?
最佳答案
我根据服务器理解的资源而不是响应(例如)GET 请求而流动的 XML 表示来考虑这一点。我有 RESTful 服务,可以返回 JSON 或 XML,或者可能返回其他表示。
所以我同意你的 POSTing 或 PUTing
/foos/{fooId}/bars
指定完整的柱线列表或添加一些柱线。
发布的有效负载的格式可以是您正在使用的媒体类型的自然序列化形式。在我的情况下,它通常是一个 JSON 字符串,因此在我的服务实现中会反序列化并查看一组资源引用 URL 字符串。
如果你的
<atom:link href="/bars/4711" />
也可以很好地反序列化,如果序列化形式有点,嗯,装饰性,我看不出问题。
总结:为你的(反)序列化器做一些自然的事情。
关于web-services - REST API 设计 : linking resources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818105/