【问题标题】:Organizing and consuming an API that apply HATEOAS组织和使用应用 HATEOAS 的 API
【发布时间】: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


【解决方案1】:

Angular-hateoas 应该为您完成(大部分)工作。但是我同意 inf3rno 并且您应该将类​​型添加到链接中。所以你可能需要扩展 Angular-hateoas 来处理它。

【讨论】:

    【解决方案2】:

    是的,客户端应该导航链接并检索它需要的任何信息。您提供可能只需要一些信息的摘要资源并没有什么反对意见,并且客户端在需要更多详细信息时会检索某些关系的链接。

    例如,在 HAL+JSON 中,您有 _embedded 属性,您可以在其中嵌入教练的摘要,为运动员页面提供有关教练所需的最少信息。

    【讨论】:

    • 我刚刚通读了 HAL 的文档,我确信这是一个好方法。我将调整我的网络服务,看看结果如何。
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 2023-01-24
    • 1970-01-01
    • 2017-08-20
    • 2018-02-05
    • 2015-11-28
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多