使用AngularJS实现HATEOAS客户端

31

我想知道Angular是否有任何隐藏的功能或由第三方库公开的功能,可以轻松创建符合HATEOAS标准的Restful客户端。

在后端,我正在使用Spring Data/REST生成符合HATEOAS标准的JSON API。 然而,使用它是完全不同的另一件事。

例如,我有这3个实体:

  • 公司 {名称,地址}
  • 员工 {名字,姓氏,雇主[公司]}
  • 活动 {费率,日期,员工[员工],客户[公司]}

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

{
    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(通过链接标识资源)的方式进行交互。例如,一个活动中有一个员工。我真正想要使用的是:{rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}

然而,正如您在第一个输出结果中看到的那样,我的活动仅包含对员工的链接,而不是其数据。是否有任何Angular或第三方库可以解析这些链接并嵌入生成的数据呢?

对此有任何意见吗?

提前感谢!


Angular中有任何隐藏的功能吗?你尝试过哪些功能无法实现你想要的效果?在Angular中,有许多方法可以展示你的数据。真的不清楚你的问题是什么。你最后一句话很难理解,请详细解释一下。 - charlietfl
嗨,我编辑了最后一句话,希望它更清晰明了。我的基本意思是:在客户端,我不想使用链接而是直接使用数据进行操作。 - fbiville
创建一个能够建立链接的服务,非常简单。你知道如何创建一个服务吗?那么你也知道如何在 JSON 文件中搜索链接并根据链接请求一些东西。这就像从服务中加载配置文件一样。当配置文件可用时,只需正确设置服务即可。 - mpm
1
创建一个Angular服务,没问题,但我不确定如何高效地实现跟随链接并解析它们的逻辑。 - fbiville
你控制REST吗?如果是这样,为什么请求员工时输出链接而不是数据。否则,您将需要向该URL发出请求以获取数据。仍然不太清楚问题所在。解释不是非常精确。 - charlietfl
这是默认的Spring Data/REST输出,它需要零时间来生成(微调它可以)。如果我们遵循HATEOAS逻辑(据我所知),符合规范的API应该公开链接,客户端应该跟随这些链接。这并不像只需要执行一个请求那么简单。例如,在活动的情况下,我必须进行以下操作:
  • 1个额外的请求以获取员工(+1个额外的请求以获取他/她的雇主)
  • 1个额外的请求以获取客户端
而这仅仅是因为我的领域非常简单,只有3个实体。是否有任何JS客户端库遵循HATEOAS约束(链接解析等)?
- fbiville
5个回答

20

请查看angular-hateoas。这是一个用于使用$resource与启用HATEOAS的REST API的AngularJS模块。


1
很酷,它在API方面看起来非常类似于Restangular。 - fbiville
1
它真正地嵌入了遵循链接的概念,与非常酷的Restangular相反! - fbiville

7
你可以编写一个“响应转换”来检查返回的对象,检查链接并在返回响应之前解决它们。请参阅$http服务文档中的“转换请求和响应”部分。像这样:
transformResponse: function(rawData) {
  var json = JSON.parse( rawData );
  forEach( json.content.links, function(link) {
    // resolve link...
  });
  return json;
}

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

正如@charlietfl指出的那样,请注意,这将导致多个HTTP调用返回单个实体。即使我喜欢HATEOAS的概念,如果进行太多调用,这很可能会导致迟缓。我建议您的服务器直接返回数据或其中一部分,以及详细信息的链接。


2

我在我的一个项目中使用了angular-hal。这是一个Spring HATEOAS后端。我没有遇到任何问题。它处理参数化资源。我怀疑它只支持HAL,所以如果你正在使用Spring Data Rest,你可能需要配置它来生成符合HAL的响应。


1
从2.2.0版本开始,Spring Data Rest响应默认为HAL格式。详见:http://docs.spring.io/spring-data/rest/docs/2.2.0.RELEASE/reference/html/#repository-resources.resource-discoverability - mounds

2

根据您的评论,希望在客户端上处理数据而非链接,我认为Restangular会是一个好的选择。


截至2014年,我也在思考在AngularJS生态系统中,什么是最适合HATEOAS风格的消费方式。那么,@Rolf,最终怎么样了? - Yosh
好的,我没有对这个问题进行足够的调查。Restangular可以非常容易地通过HTTP消耗API(无论是RESTful还是非RESTful)。不过它没有基于HATEOAS的自动发现功能。 - fbiville

0

我认为你可能存在一些困惑,因为你正在寻求一个Angular解决方案,而实际上你想要做的是让Spring Data发送一个更完整的JSON响应。也就是说,你真正想要的是服务器将员工数据作为响应JSON的一部分返回,而不是让客户端执行额外的步骤来查找它。我不知道你在Spring Data中使用的数据存储是什么,但通用的解决方案是向Activity类添加public getEmployee()方法,然后使用@RelatedTo和@Fetch注释该方法(这是Neo4J的设置,对于你的Spring Data版本可能有不同的注释)。这应该会导致Spring HATEOAS在/activity的响应中包含Employee记录。希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接