我想知道Angular中是否隐藏了某些功能,或者某些第三方库是否有任何功能可以轻松创建符合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" ...}}
。
但是,正如您在第一个输出中看到的那样,我的活动只包含员工的链接,而不包含其数据。 Angular或第三方库中是否有任何内容可以解析这些链接并嵌入生成的数据?
关于此的任何输入?
提前致谢!
答案 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记录。希望这可以帮助。