使用AngularJS的HATEOAS客户端

时间:2013-04-21 01:42:38

标签: rest angularjs hateoas spring-data-rest

我想知道Angular中是否隐藏了某些功能,或者某些第三方库是否有任何功能可以轻松创建符合HATEOAS标准的Res​​tful客户端。

在后端方面,我使用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" ...}}

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

关于此的任何输入?

提前致谢!

5 个答案:

答案 0 :(得分:20)

结帐angular-hateoas。这是一个AngularJS模块,用于在启用了HATEOAS的REST API中使用$ resource。

答案 1 :(得分:7)

您可以编写一个响应转换来检查返回的对象,检查链接并在返回响应之前解决它们。请参阅$http service documentation

中的“转换请求和响应”部分

这样的事情:

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

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

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

答案 2 :(得分:2)

根据您关于想要使用数据而不是客户端上的链接的评论,我认为Restangular非常合适。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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