【问题标题】:List all users via Github Graphql v4 API通过 Github Graphql v4 API 列出所有用户
【发布时间】:2020-03-26 01:35:11
【问题描述】:

尝试查找文档或弄清楚如何通过 v4 graphql API 复制 GitHub 的 v3 API Get all users 端点。

查询特定用户的任何内容很容易,但如何检索列出所有用户的有效负载,类似于 v3 API 有效负载?

有人可以指出正确的文档,或者更好地提供一个返回用户列表的示例吗?

【问题讨论】:

    标签: github graphql


    【解决方案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?。谢谢
      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 2018-03-10
      • 2020-11-20
      • 2021-12-28
      • 2022-08-19
      • 2018-08-21
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多