GitLab API 使用 RestAssured 进行分页。如何在一个响应中获取所有页面?

GitLab API pagination with RestAssured. How to get all pages in one response?

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

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

如我所见,我可以解析结果中的 x-next-page header 和 return 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 页 - 这是偏移量)和 returns 项 700-800。

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

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


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