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 个问题”),但通常最好假设每个用户都可能是恶意的。
我尝试从 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 个问题”),但通常最好假设每个用户都可能是恶意的。