如何从前端处理仇恨?

时间:2015-10-07 01:51:26

标签: json web-services hateoas

我有这个问题一直在我脑海中流传。让我们假设我们在不同的层上使用后端和前端构建了我们的项目。所以,从前端开始,我们希望得到一个以hal+json格式出现的客户:

GET /customers/1 HTTP/1.1
Accept: application/hal+json
{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } {
        "rel": "transactions",
        "href": "http://localhost:8080/customer/1/transactions"
    }]
}

然后,从前端我想获得所有客户交易。我的问题是:我该如何获得网址?它应该来自回应吗?或者我应该在内部构建它?

如果我们选择第一个选项,我认为在我们得到我们想要的那个之前,迭代所有链接可能并不优雅。此外,可能会出现我们没有想要做的请求链接的情况。

如果我们选择第二个选项,如果我们没有实际拥有ID,我就不会理解如何构建该网址。如果hateoas用链接替换id,我怎么能创建新的客户交易呢?我还没有在体内获得对象参考?

我认为也许服务应该同时支持application/hal+json(面向用户)和application/json(面向客户),但我不知道这是如何一般地完成它。

您怎么看?

2 个答案:

答案 0 :(得分:3)

绝对是第一个选择。也就是说,由于HATEOAS是Richardson Maturity Model的最后阶段,因此客户应遵循提供的链接,而不是自己构建URL:

  

超媒体控制的关键在于它们告诉我们我们能做些什么   接下来,我们需要操作的资源的URI来完成它。   而不是我们必须知道在哪里发布我们的预约请求,   响应中的超媒体控件告诉我们该怎么做。

这会带来什么好处?我至少可以想到两个:

  • 简单升级REST API - 服务器端开发人员可以更改资源的URI,而不会破坏客户端代码,因为客户端只需遵循提供的链接;此外,服务器端开发人员可以轻松添加新链接
  • 健壮性 - 通过关注链接,客户端代码永远不会尝试访问损坏的链接,拼写错误的链接等。
  

问:此外,可能会出现我们没有想要做的请求链接的情况吗?

由API设计人员决定是否提供所有必需的链接。前端开发人员不应该担心这一点。

另见:

答案 1 :(得分:1)

HATEOAS(超媒体作为应用程序状态的引擎)是REST应用程序体系结构的约束。例如,您可以查看Spring HATEOAS文档:

https://spring.io/understanding/HATEOAS

使用Spring和AngularJS的另一个关于它的链接可以在这里找到:

AngularJS and Spring HATEOAS tutorial

这个似乎足够好并处理你的用例。

问候,André