使用HATEOAS批量获取

时间:2019-08-19 19:08:06

标签: rest api bulk hateoas

我已经看到了HATEOAS的许多示例,其中每个资源都有到相关资源的链接。一个每页返回N个特定资源项的API,客户端可能需要使用N个调用才能通过使用HATEOAS来获取任何嵌套资源。例如:

获取城市/文档:

[{
    id: 1,
    city: {
        self: 'http://service.com/cities?filter=id==1'
    },
    document: { ... }
    ...

}, {
    id: 2,
    city: {
        self: 'http://service.com/cities?filter=id==2'
    },
    document: { ... }
    ...
}]

仅供参考,查询参数使用FIQL语法定义过滤器。

现在,如果客户端要获取每个文档的城市详细信息(以显示在UI上),则可能需要N次额外的呼叫。但是在我的情况下,/cities API可以另外使用多个城市ID,例如:/cities?filter=id=in=(1,2),可以将N个调用减少为一个。有没有办法使用HATEOAS来表达类似的信息?我已阅读过有关模板的信息,但不确定该模板的外观以及客户端如何使用它?

1 个答案:

答案 0 :(得分:0)

  

我已经看到了HATEOAS的许多示例,其中每个资源都有到相关资源的链接。该API每页返回N个特定资源项,客户端可能需要使用N个调用才能通过使用HATEOAS来获取任何嵌套资源。

是的。在Server-Push的世界中,情况并非如此,在Server-Push中,服务器可以根据查询主动提供多种资源。如果您想查询一个网页,获取html,然后获取图像和Java脚本资源 ,那么您也有了正确的想法。

  

API可以另外使用多个城市ID,例如:/ cities?filter = id = in =(1,2),可以将N个调用减少为一个。有没有办法使用HATEOAS来表达类似的信息?

是的

让我们仔细地学习一下。您在此处所做的是引入了一个新资源,其标识符为/cities?filter=id=in=(1,2)。您可能有另一个资源/cities?filter=id=in=(1,20)和另一个资源/cities?filter=id=in=(1,2000)。在您的实现中,它们可能是一个“单个端点”,可从标识符中提取参数并使用它们生成正确的表示形式。

所以,您得到的就像是一个数据传输对象-一次即可获取的大量资源。

  

我已经阅读了有关模板的内容,但不确定该模板的外观以及客户端如何使用它?

您可能已经看到的最简单的示例是Web表单。您允许客户端提供开始和结束元素,然后表单处理将获取该信息并从中创建指定的URI。

/filtered-cities?start=1&end=2000

因此,客户需要了解表单的用途,以及如何识别表单中不同元素的语义。 agent 需要了解将表单数据传输到URI的处理规则。

URI Templates是相同的基本概念;它们为您提供了一种领域不可知的语言,可用来描述参数在资源标识符中的位置。基本模式是相同的-参数的语义需要达成共识,服务器提供URI,客户端提供参数映射,通用代码可以处理合并

uri = template.apply(parameterMap)

URI模板不如表单强大。使用表单时,可以为参数引入默认值,但是URI模板中没有类似功能。

HAL-Forms可以使您更好地了解基于表单的方法如何在JSON中工作。