如何使用GraphQL界面从GitLab部署中检索所有用户?

问题描述

我正在尝试从GitLab加载用户信息,以便可以将用户名与问题相关联。查询问题时,受让人用户名不直接可用。而是可以使用用户ID。

如果我在GitLab部署上使用/-/graphql-explorer端点执行此GraphQL查询

query {                                                                                                                                                                                       
  users {                                                                                                                                                                                     
    nodes {                                                                                                                                                                                   
      id                                                                                                                                                                                      
      name                                                                                                                                                                                    
      username                                                                                                                                                                                
    }                                                                                                                                                                                         
  }
}

然后返回91个用户。但是,显然这不是部署中的所有用户。我知道有一些用户存在,但不包含在结果中。我可以使用以下GraphQL查询单独查询它们:

query {
  user(username: "someusername") {
    id
  }
}

并收到似乎正确描述用户的结果。

为什么从此查询的结果中省略了一些用户?我知道较大的结果集需要处理分页,但是页面大小应该为100,并且我收到的结果少于此。此外,如果我请求pageinfo并在生成endCursor之后要求用户,我将不会收到任何物品。

如何提交查询以吸引所有用户?失败了,我该如何提交一个查询,让我获得可以成为一个组的所有用户(或者失败,获得一个项目列表)?

解决方法

来自documentation

默认情况下,GitLab的GraphQL API将仅返回任何集合的前100条记录。可以使用第一个或最后一个参数来更改。这两个参数都带有值,因此first:10将返回前10条记录,last:10将后10条记录。

因此,您必须自己进行分页,例如,您的第一个查询:

query {                                                                                                                                                                                       
  users(first: 10) {
    edges {
      node {                                                                                                                                                                                   
        id                                                                                                                                                                                      
        name                                                                                                                                                                                    
        username                                                                                                                                                                                
      } 
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}

然后使用PageInfo结果值来知道是否还有更多页面要获取,而光标ID是否要获取下一页,例如,您可以获得以下结果:

...
"pageInfo": {
   "endCursor": "eyJpZCI6Ijc****************zNjk0MDUwMDAgOVRDIn0","hasNextPage": true
}

因此,对于下一页,您必须查询:

query {                                                                                                                                                                                       
  users(first: 10,after: "eyJpZCI6IjcxMj**********************Ni4zNjk0MDUwMDAgOVRDIn0") {
    edges {
      node {                                                                                                                                                                                   
        id                                                                                                                                                                                      
        name                                                                                                                                                                                    
        username                                                                                                                                                                                
      } 
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}

依次类推,直到hasNextPage返回false

有关分页和游标的更多信息,请参见GraphQL文档:https://graphql.org/learn/pagination/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...