Rest 带有AngularJS的HATEOAS客户端

Rest 带有AngularJS的HATEOAS客户端,rest,angularjs,hateoas,spring-data-rest,Rest,Angularjs,Hateoas,Spring Data Rest,我想知道Angular中是否有隐藏的功能,或者是否有一些第三方库公开的功能,可以轻松创建兼容HATEOAS的Restful客户端 在后端,我使用SpringData/REST生成一个HateoasJSONAPI。 然而,消费它完全是另一回事 例如,我有3个实体: 公司{名称、地址} 员工{firstName,lastName,雇主[公司]} 活动{费率、日期、员工[员工]、客户[公司]} 请求活动(模型中最复杂的实体)会产生如下结果: { links: [], content

我想知道Angular中是否有隐藏的功能,或者是否有一些第三方库公开的功能,可以轻松创建兼容HATEOAS的Restful客户端

在后端,我使用SpringData/REST生成一个HateoasJSONAPI。 然而,消费它完全是另一回事

例如,我有3个实体:

  • 公司
    {名称、地址}
  • 员工
    {firstName,lastName,雇主[公司]}
  • 活动
    {费率、日期、员工[员工]、客户[公司]}
请求活动(模型中最复杂的实体)会产生如下结果:

{
    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"
            }]
        }]
}
transformResponse: function(rawData) {
  var json = JSON.parse( rawData );
  forEach( json.content.links, function(link) {
    // resolve link...
  });
  return json;
}
我的API以REST(由链接标识的资源)为基础。 例如,一个活动有一个雇员。我真正想要使用的是:
{费率:456,日期:1366754400000,员工:{名字:“xxx”,名字:“xxx”…}

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

有什么意见吗


提前谢谢

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

大概是这样的:

{
    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"
            }]
        }]
}
transformResponse: function(rawData) {
  var json = JSON.parse( rawData );
  forEach( json.content.links, function(link) {
    // resolve link...
  });
  return json;
}
由于“解析链接”步骤本身是一个$http调用,因此子引用也将被解析。然而,由于这些是异步的,您可能会返回一个承诺而不是实际值;我不知道转换函数是否允许这样做


然而,正如@charlietfl所指出的,请注意,这将导致几个HTTP调用返回单个实体。尽管我喜欢HATEOAS的概念,但如果打太多电话,可能会导致行动迟缓。我建议您的服务器直接返回数据或其中的一部分,并加上详细信息的链接。

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

签出。它是一个AngularJS模块,用于将$resource与支持HATEOAS的RESTAPI一起使用。

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

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

Angular中隐藏的任何功能
…您尝试过哪些功能无法实现您想要的功能?在angular中有许多方法可以显示您的数据。你的问题真的不清楚。你的最后一句话很难理解。请更详细地解释嗨,我编辑了最后一句话,希望它更清楚。我的基本意思是:在客户端,我不想处理链接,而是直接处理数据。创建一个服务来设置链接,这很简单。您知道如何创建服务吗?然后您就知道如何在json文件中搜索链接,并根据链接请求一些内容。这就像从服务加载配置文件一样。配置可用后,只需正确设置服务。创建角度服务,是的,我可以做到。但我不知道如何有效地实现跟踪链接并解决它们的逻辑。你控制其余的吗?如果是这样的话,为什么它在请求员工时输出链接而不是数据。另一方面,您必须向该url发出请求才能获取数据。还是不太清楚是什么问题。2014年的解释还不太准确,我也在想什么最适合HATEOAS风格的消费。那么它是如何结束的,@Rolf?嗯,我没有对这个问题进行足够的调查。Restangular允许通过HTTP(可能是RESTful的,也可能不是RESTful的)非常容易地使用API。虽然没有自动发现(基于HATEOAS)。很酷,它看起来非常类似于Restangular(API方面)。它确实嵌入了以下链接的概念,与Restangular相反,Restangular非常酷!