调用 GitHub API v4 GraphQL

总结

我正在描述GitHub API v4 GraphQL的以下内容。

v3 RESTとの比較
なぜ GraphQL なのか?
GraphQLクエリの例
実装例 ( bash )
実装例 ( python )

引用文献

关于v3 REST,我在下面撰写了一篇文章。

    • GitHub API を 叩く – Qiita

 

    GitHubリポジトリのスター数でOSSランキングを作成する – Qiita

请参考PyFukuoka #7演讲时的资料,了解有关v4 GraphQL的内容。
通过Python快速入门图数据库 – 演讲人笔记

本文中的示例代码已放在以下位置。
loftkun/github-api-samples: 使用GitHub API的有用脚本。

V3对比V4

項目GitHub API v3 RESTGitHub API v4 GraphQLアーキテクチャRESTGraphQL認証オプション必須認証方式Basic or OAuth〃エンドポイント複数1つ

为什么选择GraphQL?

Github GraphQL API v4 | Github Developer Guide中提到了以下内容。

GraphQL lets you replace multiple REST requests with a single call to fetch the data you specify.

看起来可以将多个请求替换为一次调用有益处呢。
确实,v3 的每个PR或问题都有独立的终端点,但是在v4中,终端点只有一个,并且可以在查询中指定想要获取的PR或问题的条件。

GraphQL查询示例

这是一个搜索Python/Python-docs-ja的PR和Issue的查询示例。


  query {
    repository(owner:"python", name:"python-docs-ja") {
      pullRequests(first: 2) {
        nodes {
          title
          url
        }
      }
      issues(last:2, states:CLOSED) {
        edges {
          node {
            title
            url
          }
        }
      }
    }
  }

实现示例(bash)

这些示例存放在github-api-samples/demo.sh中。

这个例子展示了查询当前经过身份验证的用户信息。


# OAuthトークン
TOKEN=your_oauth_token

# Endpoint
API=https://api.github.com/graphql

curl -d @- -X POST -H "Authorization: bearer ${TOKEN}" "${API}" << EOF
  {
    "query": "query { viewer { login }}"
  }
EOF

实现示例(Python)。

这些示例代码被放在了github-api-samples/demo.py文件中。

这个查询是用于搜索Python星标较多的存储库的示例。


def post(query):
    headers = {"Authorization": "bearer " + token}
    res = requests.post(endpoint, json=query, headers=headers)
    if res.status_code != 200:
      raise Exception("failed : {}".format(res.status_code))
    return res.json()

# query
query={ 'query' : """
  query {
    search(query: "language:python stars:>=1000 sort:stars", type: REPOSITORY, first: 10) {
      edges {
        node {
          ... on Repository {
            nameWithOwner
            url
            createdAt
            description
            stargazers{
              totalCount
            }
          }
        }
      }
    }
  }
  """
}

# post
res = post(test)
print('{}'.format(json.dumps(res)))

广告
将在 10 秒后关闭
bannerAds