6

我已经厌倦了在 github grpahQL API 中使用 endCursor 和 hasNextPage 来获取 100 多个数据。我使用的查询是:

query {
      organization(login:"XXX") {
                   repository(name:"XX") {
                   pullRequests(first:100, states:[OPEN], after: "XXX" ) {
        pageInfo{
          hasNextPage
          endCursor
        }
      }
    }

这是工作。但是为了访问更多细节,需要进行迭代分页。任何人都可以提供一种有效的替代方案来以编程方式在 GraphQL API 中遍历所有页面吗?

4

2 回答 2

1

从 Simon Willison 的“使用 Python 通过 GitHub GraphQL API 分页”中获得灵感,这是我为查询分页所做的工作:

query {
  node(id: "PROJECT_ID") {
    ... on ProjectNext {
      items(first: 100 after: CURSOR) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          title
          fieldValues(first: 8) {
            nodes {
              value
            }
          }
          content {
            ... on Issue {
              number
              labels(first: 50) {
                nodes {
                  name
}}}}}}}}}

在我的 Python 代码中,我PROJECT_ID使用一个设置为我正在引用的项目 ID 的变量进行拼接。

对于光标最初after: CURSOR替换为"",然后为下一页我设置cursor = 'after:\\"' + response["data"]["node"]["items"]["pageInfo"]["endCursor"] + '\\"'

我的完整代码在我的 dump_cards 实用程序的atdumpmemex模块中。

这里的关键是pageInfo与其他相关节点相处,然后抓住endCursor每次都hasNextPage为真,以便可以将其馈送到查询中以进行下一次迭代。

pageInfo 将类似于:

"pageInfo": {
  "hasNextPage": false,
  "endCursor": "Y3Vyc29yOnYyOpHOAAhOsg=="
}

目前endCursor是 base64 编码cursor:v2:XYZ,但不要依赖它,因为 GitHub 已将其他 ID 从 base64 编码转移到其他方案。

于 2021-11-19T18:42:20.247 回答
0

使用 endCursor 进行分页是一种解决方案。与 REST API 一样,您无法务实地遍历所有页面。正如您指定的那样,您可以指定 endCursor 并遍历(如果有下一页)

于 2018-03-20T04:59:38.113 回答