web-services - REST API 设计 : linking resources

标签 web-services api rest

假设我有两个顶级资源 FooBar .现在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但是如何分配 BarFoo然后?假设客户端将访问 /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/

相关文章:

Android - 如何处理 XML 中的 Web 服务?

java - 在一台计算机上测试大量 Web 服务

java - 基于接口(interface)的 Java/Groovy Web 服务

java - Watson STT Java - Websockets Java 和 HTTP POST 之间的不同结果

python - Django 休息框架返回嵌套序列化数据的时间太长

web-services - 从 F# 3.0 查询蛋白质数据库

c# - WCF 服务故障处理 WS-Discovery Resolve 消息

api - REST API GET 方法

python - Flask POST 请求导致服务器崩溃

c# - 使用 Google 作为身份提供商,通过 Azure ACS 对 Restful 服务进行身份验证