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