【问题标题】:bulk GET using HATEOAS使用 HATEOAS 批量获取
【发布时间】:2019-12-25 00:28:29
【问题描述】:

我见过很多 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 来表达这样的事情?我已经阅读了有关模板的信息,但不确定模板应该是什么样子以及客户如何使用它?

【问题讨论】:

    标签: rest api bulk hateoas


    【解决方案1】:

    我见过很多 HATEOAS 示例,其中每个资源都有指向相关资源的链接。每个页面返回 N 项特定资源的 API,客户端可能需要 N 次调用才能通过使用 HATEOAS 来获取任何嵌套资源。

    是的。在使用 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
    

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

    URI Templates是相同的基本思想;它们为您提供了一种与域无关的语言,用于描述参数在资源标识符中的位置。基本模式是一样的——需要对参数的语义达成一致,服务器提供 URI,客户端提供参数映射,通用代码可以处理合并

    uri = template.apply(parameterMap)
    

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多