GitLab API 分页与 RestAssured如何在一个响应中获取所有页面?

问题描述

我尝试从 GitLab API 获取所有问题。 GitLab API 允许出现分页问题,​​但每页最多 100 个:

https://docs.gitlab.com/ee/api/README.html#pagination

正如我所见,我可以解析 x-next-page 标头并在结果中返回 List<Response>,但最好在一个响应中获取所有页面

我发现我可以使用 pagination=keyset 参数,但它没有帮助,每页我仍然收到 100 个问题。我的尝试:

        return RestAssured.given()
                .log().all()
                .accept("json")
                .header("PRIVATE-TOKEN",TOKEN)
                .queryParam(STATE,"opened")
                .queryParam("pagination","keyset")
                .queryParam("per_page","100")
                .when().get(url)
                .then()
                .extract()
                .response();

解决方法

我不熟悉这个 API,但我会从文档中得出结论,这是不可能的。

pagination=keyset 只是实现分页的一种不同风格。您仍然被迫使用分页。

默认的分页样式是基于偏移量的,其中您的查询内容类似于“我的页面有 100 个项目,我在第 8 页”。然后服务器对问题进行排序,跳过前 700 个(您已经看到的第 1-7 页 - 这是偏移量),并返回第 700-800 个项目。

使用基于键集的样式,您的查询将显示类似“我看到的最后一个项目的 ID 为 ABCDEF,我想要接下来的 100 个项目”。根据文档,这种方式更有效,大概是因为服务器存储项目的方式。

我认为基于偏移量是默认设置,因为这是在其他 API 中实现分页的更常见方式。


强制执行某些上限是很好的防御性 API 设计。没有上限可能意味着服务器必须尝试为 1000 万个问题编写巨大的 JSON/XML 响应。懒惰的开发人员可能会使用它,因为它看起来“更容易”,即使他们只关心前几项。如果您知道自己在做什么,这可能看起来过于严格(“好吧,这个 repo 保证永远不会有超过 5 个问题”),但通常最好假设每个用户都有潜在的恶意。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...