【发布时间】:2014-04-02 19:58:12
【问题描述】:
去年我一直在做一个爱好项目。我使用 Spring MVC(目前为 4 个),并创建了一个 Web 服务,试图遵守 REST 原则。
我有一个名为Athlete 的资源,它与SportEvent、'Trainer` 等其他资源有关系。
这些关系并未嵌入到运动员资源中。相反,它们是链接。这是一个例子:
{
"firstName": "James",
"lastName":"Smith",
"links": [{
"rel": "trainer",
"href" : "http://somehost.com/sport/trainers/4"
},
{
"rel": "sport-events",
"href" : "http://somehost.com/sport/athletes/4/sport-events"
}]
}
我目前正在用 AngularJS 编写客户端,我将使用这个 API。正是在这个过程中,我发现了一些我没有想到的东西。 客户实际上将如何使用它?
假设我正在为运动员构建常规详细信息页面。我也想向运动员教练展示。我必须以某种方式拥有一个 HTTP 客户端库,该库能够解决我想要的关系,并以递归方式将响应附加到“父”资源(具有关系的资源)。
它实际上打算如何导航这样的 API?如果没有明确说明要关注的链接,您就无法关注链接?因为如果你不这样做,你最终会创建潜在的巨大对象。你想要某种标准吗?
我对如何实际使用我的 API 非常感兴趣(听起来很奇怪,但我没有考虑过动态解析链接的实际过程)。如果我能得到一个关于如何在 JavaScript 中做到这一点的解释(使用库很好),那将是一个巨大的奖励。我正在使用 AngularJS,所以如何应用它会更好。
【问题讨论】:
-
你应该开发你的链接,你应该向它们添加输入字段并定义它们正在使用的 http 方法,而不仅仅是关系......所以你的客户将能够调用你的链接,即使它对链接关系一无所知。我认为使用标准/推荐的媒体类型、JSON-LD、HAL+JSON 等会更好......
-
@inf3rno 你能扩展你的答案吗?向它们添加输入字段是什么意思?
-
这是一个例子:gist.github.com/mikekelly/5619934 在我的词汇表中,链接是一个抽象控制器,您可以通过它与您的 REST 服务进行通信。它的表示可以是 HTML A 元素、FORM 元素甚至是 XHR 实例...
-
例如,如果您有一个个人资料页面并且您只想获取birthDay 和用户名,那么您应该在queryString 中发送fields 参数。
GET /users/1?fields="name,birthDay"。 fields 参数可以由服务自己填写,也可以由客户端填写。后者可以在你描述参数的时候完成,所以你告诉客户端,这个上下文中的fields参数可以包含id, name, birthDay, lastVisit, parents, friends, etc...这个类型的信息应该添加到每个链接,等待params,如果你想要一个解耦客户端。 -
stackoverflow.com/a/20767057/607033 这是另一个用参数描述链接的例子。
标签: java javascript spring angularjs rest