我有这个问题一直在我脑海中流传。让我们假设我们在不同的层上使用后端和前端构建了我们的项目。所以,从前端开始,我们希望得到一个以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
(面向客户),但我不知道这是如何一般地完成它。
您怎么看?
答案 0 :(得分:3)
绝对是第一个选择。也就是说,由于HATEOAS是Richardson Maturity Model的最后阶段,因此客户应遵循提供的链接,而不是自己构建URL:
超媒体控制的关键在于它们告诉我们我们能做些什么 接下来,我们需要操作的资源的URI来完成它。 而不是我们必须知道在哪里发布我们的预约请求, 响应中的超媒体控件告诉我们该怎么做。
这会带来什么好处?我至少可以想到两个:
问:此外,可能会出现我们没有想要做的请求链接的情况吗?
由API设计人员决定是否提供所有必需的链接。前端开发人员不应该担心这一点。
另见:
答案 1 :(得分:1)
HATEOAS(超媒体作为应用程序状态的引擎)是REST应用程序体系结构的约束。例如,您可以查看Spring HATEOAS文档:
https://spring.io/understanding/HATEOAS
使用Spring和AngularJS的另一个关于它的链接可以在这里找到:
AngularJS and Spring HATEOAS tutorial
这个似乎足够好并处理你的用例。
问候,André