我已经看到了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来表达类似的信息?我已阅读过有关模板的信息,但不确定该模板的外观以及客户端如何使用它?
答案 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中工作。