31

我想知道是否有任何隐藏在 Angular 中或由某些 3rd 方库公开的功能来轻松创建符合 HATEOAS 的 Restful 客户端。

在后端,我使用 Spring Data/REST 来生成 HATEOAS JSON API。但是,消费它是另一回事。

例如,我有这 3 个实体:

  • 公司{name, address}
  • 员工{firstName, lastName, employer[Company]}
  • 活动{rate, day, employee[Employee], client[Company]}

并请求一个活动(模型中最复杂的实体)会产生如下内容:

{
    links: [],
    content: [{
            rate: 456,
            day: 1366754400000,
            links: [{
                rel: "self",
                href: "http://localhost:8080/api/activities/1"
            },
            {
                rel: "activities.activity.client",
                href: "http://localhost:8080/api/activities/1/client"
            },
            {
                rel: "activities.activity.employee",
                href: "http://localhost:8080/api/activities/1/employee"
            }]
        }]
}

我的 API 在 REST(由链接标识的资源)方面进行讨论。例如,一个 Activity 有一个 Employee。我真正想要使用的是:{rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}

但是,正如您在第一个输出中看到的那样,我的 Activity 仅包含指向员工的链接,而不包含其数据。Angular 或第 3 方库中是否有任何东西可以解析这些链接并嵌入结果数据?

对此有任何意见吗?

提前致谢!

4

5 回答 5

20

结帐angular-hateoas。它是一个 AngularJS 模块,用于将 $resource 与支持 HATEOAS 的 REST API 一起使用。

于 2014-04-01T02:18:33.230 回答
7

您可以编写一个响应转换来检查您返回的对象,检查链接,并在返回响应之前解析它们。请参阅$http 服务文档中的“转换请求和响应”部分。

像这样的东西:

transformResponse: function(rawData) {
  var json = JSON.parse( rawData );
  forEach( json.content.links, function(link) {
    // resolve link...
  });
  return json;
}

由于“解析链接”步骤本身就是一个 $http 调用,因此子引用也将被解析。然而,由于这些是异步的,你可能会返回一个承诺而不是真正的价值;我不知道是否允许转换功能这样做。

但是,正如@charlietfl 指出的那样,请注意这将导致多次 HTTP 调用返回单个实体。尽管我喜欢 HATEOAS 的概念,但如果调用过多,这可能会导致反应迟缓。我建议您的服务器直接返回数据或其中的一部分,加上链接以获取详细信息。

于 2013-04-22T06:49:53.717 回答
2

我一直在为我的一个项目使用angular-hal。这是一个 Spring HATEOAS 后端。而且我没有遇到任何问题。它处理参数化资源。我怀疑它只支持 HAL,因此由于您使用的是 Spring Data Rest,您可能必须对其进行配置以生成符合 HAL 的响应。

于 2014-10-16T23:15:38.073 回答
2

根据您关于希望使用数据而不是客户端上的链接的评论,我认为Restangular将是一个不错的选择。

于 2013-07-30T19:59:29.147 回答
0

我认为混淆可能是您要求使用 Angular 解决方案,而您真正想要做的是让 Spring Data 发送更完整的 JSON 响应。即,您真的只是希望服务器将员工数据作为响应 JSON 的一部分返回,而不是让客户端执行额外的步骤来查找它。我不知道您在 Spring Data 中使用的是什么数据存储,但一般的解决方案是将 public getEmployee() 方法添加到您的 Activity 类,然后使用 @RelatedTo 和 @Fetch 注释该方法(这将是设置Neo4J - 可能是您对 Spring Data 风格的不同注释)。这应该会导致 Spring HATEOAS 在 /activity 的响应中包含 Employee 记录。希望这可以帮助。

于 2015-10-16T12:04:17.017 回答