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

6

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

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

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

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

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

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

为什么有些用户在此查询结果中被省略了?我知道处理大量结果集需要处理分页,但默认页面大小应该是100,而我收到的结果比这个数量还少。另外,如果我请求 pageinfo 并要求获取结果 endCursor 后的用户,则不会收到任何项目。

如何提交一个查询来获取所有用户?如果无法达到这个目标,如何提交一个查询来获取所有可以作为组分配者(或者在项目列表中)的用户?


我在GraphQL应用程序的源代码中看不到任何限制。 - wowkin2
我在想这是否与其他类型的访问控制有关呢?在列表中查看某些用户是否需要权限? - Jean-Paul Calderone
想知道您是否是存储库的管理员?如果是,这个帖子可能会对您有所帮助 https://gitlab.com/gitlab-org/gitlab/-/issues/197939#note_275761727 。 - Prafulla Kumar Sahu
我不是GitLab实例上任何项目的管理员。我是几个项目的“维护者”。 - Jean-Paul Calderone
我更新了问题,以解释为什么我想要完整的用户列表。 - Jean-Paul Calderone
1个回答

11

根据文档

默认情况下,GitLab的GraphQL API仅返回任何集合的前100个记录。可以通过使用first或last参数来更改此设置。这两个参数都需要一个值,因此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/


这是有道理的,但不是对这个问题的答案。我的查询没有指定限制,所以它应该继承默认的100个限制,但它没有收到100个结果,只有91个。 - Jean-Paul Calderone
我编辑了问题,以明确分页交互。 - Jean-Paul Calderone
抱歉,我错过了那个问题。恐怕我无法提供帮助。也许可以检查用户状态(有些用户可能被封锁或已过期,因为他们不占用座位,所以可能会从结果中省略,但这似乎很奇怪...)。否则,正如你指出的,可能是权限问题...祝你好运。 - Yann39
1
@Jean-PaulCalderone会和Yann39说一样的话。既然这不是你要找的,那么请联系支持团队(https://about.gitlab.com/support/)。 - Tiago Martins Peres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接