通过 Github Graphql v4 API 列出所有用户
Posted
技术标签:
【中文标题】通过 Github Graphql v4 API 列出所有用户【英文标题】:List all users via Github Graphql v4 API 【发布时间】:2020-03-26 01:35:11 【问题描述】:尝试查找文档或弄清楚如何通过 v4 graphql API 复制 GitHub 的 v3 API Get all users 端点。
查询特定用户的任何内容很容易,但如何检索列出所有用户的有效负载,类似于 v3 API 有效负载?
有人可以指出正确的文档,或者更好地提供一个返回用户列表的示例吗?
【问题讨论】:
【参考方案1】:据我所知,在 v4 api 中没有等效于“获取所有用户”的功能,但是,您可以使用节点查询来接近它。
首先,您需要能够生成节点 ID 以进行迭代。查看 mojombo
(数据库 ID 的第一个用户),您可以看到节点 ID 是如何派生的。
$ curl https://api.github.com/users/mojombo
"login": "mojombo",
"id": 1,
"node_id": "MDQ6VXNlcjE=",
...
$ echo -n "MDQ6VXNlcjE=" | base64 -d
04:User1
它是字符串04:User
,后跟用户id
(数据库ID)。
知道了这一点,我们现在可以一次为 100 个用户生成节点查询。注意:并非所有数据库 ID 都是用户,有些是组织或已删除用户,因此您会收到很多 NOT_FOUND
错误。
query($ids:[ID!]!)
nodes(ids:$ids)
... on User
login
variables
"ids": ["MDQ6VXNlcjE=", "MDQ6VXNlcjI=", ...]
如果您不仅限于使用 v4 api,但仍想利用 v4 api 的改进性能,那么还有一个稍微不那么 hacky 的替代方案,即使用 v3 api 一次获取 100 个用户,然后使用返回的 node_id
字段使用上述技术对所有 100 个用户执行批量 v4 查询。使用这种方法可以大大减少NOT_FOUND
错误,因此可以更好地利用您的速率限制。
为了了解使用 v4 api 和这种技术可以获得的性能改进,我执行的任务从使用 v3 api 大约需要 474 天减少到使用这种方法不到 5 天。
【讨论】:
【参考方案2】:搜索查询对此非常有效。您可以根据特定字段进行查询,它会返回一个用户列表。如果您正在寻找一个特定的用户,这通常很好。如果您正在寻找大量用户,则搜索 api 不是您想要的,因为它已针对根据输入查找一个值进行了优化。请参阅下面的示例:
search(query: "location:toronto language:Go", type: USER, first: 10)
userCount
edges
node
... on User
login
name
location
email
company
【讨论】:
请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。见:How do I write a good answer?。谢谢以上是关于通过 Github Graphql v4 API 列出所有用户的主要内容,如果未能解决你的问题,请参考以下文章
markdown Github API v4 GraphQL
使用 GitHub GraphQL API v4 查询单个存储库中的所有提交
GitHub V4 GraphQL API with Java 使用一些 GraphQL Java 库(如果可用)
使用 github API v4 graphQL 获取提交更改的文件和补丁
GraphQL 复杂 cURL 查询(GitHub API v4)
如何将 Github API v4 (graphql) 与 javascript XMLHttpRequest 一起使用