Graphql API 分页问题

Posted

技术标签:

【中文标题】Graphql API 分页问题【英文标题】:Graphql API pagination issue 【发布时间】:2022-01-05 05:26:30 【问题描述】:

我想从特定用户那里获取所有存储库。如果用户有很多仓库,最好使用分页。

据我所见,我们可以传递 first 和 last 属性。但是如果我想在 10 到 20 之间获取存储库怎么办?

query MyQuery 
  user(login: "someuser") 
    repositories(first:10" ) 
      totalCount
      nodes 
        name
      
    
  

您可以在这里访问 => https://docs.github.com/en/graphql/overview/explorer

提前致谢

【问题讨论】:

【参考方案1】:

GitHub GraphQL API 使用流行的cursor-based pagination pattern。每条记录都有一个不透明的、类似 id 的光标。从查询中返回光标。将其用作下一个查询的输入。 Apollo Client has tools 来帮忙。


  repository(name: "apollo-client", owner: "apollographql") 
    issues(last: 10, after: "Y3Vyc29yOnYyOpHOP2I0Sw==") 
      edges 
        node 
          createdAt
          title
        
        cursor
      
    
  

【讨论】:

【参考方案2】:

你最多可以得到 100 个节点,但是你需要使用分页,这是通过为 hasNextPageendCursor 获取 pageInfo 来完成的

例如我可以通过以下方式获得前 100 个存储库:

query ReposByUser 
  user(login: "cpswan") 
    repositories(first: 100) 
      totalCount
      nodes 
        name
      
      pageInfo 
        hasNextPage
        endCursor
      
    
  

响应将以:

结尾
        "pageInfo": 
          "hasNextPage": true,
          "endCursor": "Y3Vyc29yOnYyOpHOFdXRZQ=="
        

所以我可以通过以下方式获取下一页:

query ReposByUser 
  user(login: "cpswan") 
    repositories(first: 100 after: "Y3Vyc29yOnYyOpHOFdXRZQ==") 
      totalCount
      nodes 
        name
      
      pageInfo 
        hasNextPage
        endCursor
      
    
  

这一次以这告诉我没有更多的页面结束:

        "pageInfo": 
          "hasNextPage": false,
          "endCursor": "Y3Vyc29yOnYyOpHOGb3wAQ=="
        

【讨论】:

要看到上一页,我想我需要之前使用它。但是 hasNextPage 和 hasPreviousPage 返回 false。我正在使用 startCursor 如果hasNextPagehasPreviousPage 都为假,则意味着totalCount 低于最大页面限制(在我的示例中为100)。在大多数情况下,是从前 100 个页面开始,还是从前 100 个页面开始,或者从最后 100 个页面开始,并没有什么区别。

以上是关于Graphql API 分页问题的主要内容,如果未能解决你的问题,请参考以下文章

Python GraphQL API 调用组合

Python GraphQL API 调用组合

GraphQL 是不是内置了分页功能?

GraphQL 分页 |第一个请求

graphql 中用于分页的连接

GraphQL:为常规列表实现窗口分页