はじめに
backlog git のリポジトリを、githubのリポジトリに日時バックアップする仕組みを作ろうとしています。
Github API v4でGraphQLが使われており、初めて触ってみたので、備忘録として記事にします。
v3はよくあるREST APIで、並行運用中。v4ではまだできないけど、v3ではできることが少なからずあるようです。
GraphQLとは
jsonぽい文字列をリクエストすると、欲しい項目だけを狙って取得できるクエリ言語。
詳細は、エンジニアHubの記事が参考になりました!
personal access token発行
APIとやりとりするのに、githubのアクセストークンが必要です。CreditEngine Techのページなどを参考にしました。
リクエストしてみる
GitHub公式ドキュメントを参考にリクエストします。普段使っている、Postmanでの手順を書きます。
下記のように、mehtod, url, Headers, Bodyを設定します。下記に注意。
- Authoraizationの{personal access token}: 作成したpersonal access token
- bodyの{name}: リポジトリのオーナー名。https://github.com/hoge のhogeの部分。
query {
repositoryOwner(login:"{name}") {
repositories(first:100){
pageInfo {
startCursor,
hasNextPage,
endCursor
}
nodes {
name,
pushedAt,
sshUrl
}
}
}
}
設定できたらSend押下。
レスポンス
上手くいけば、Postmanの下の方の画面(レスポンスBody)に、下記のようなjson文字列が表示されます。
{
"data": {
"repositoryOwner": {
"repositories": {
"pageInfo": {
"startCursor": "Y3Vyc29yOnYyOpHOAuGt0w==",
"hasNextPage": false,
"endCursor": "Y3Vyc29yOnYyOpHOCnpKcg=="
},
"nodes": [
{
"name": "{repo}",
"pushedAt": "2015-12-31T12:16:23Z",
"sshUrl": "git@github.com:{name}/{repo}.git"
},
]
}
}
}
}
クエリの詳細
一度に取れるのが最大100件までの仕様になってるので、それを以上取得したい場合、ページIDを指定して再リクエストが必要です。
pageInfoは無くてもOK。
query {
repositoryOwner(login:"{name}") { // リポジトリのオーナーを指定
repositories(first:100){ // リポジトリの最初の100件を取得
pageInfo { // 取得したいページ情報を指定
startCursor, // 1件目のページID
hasNextPage, // 次のページの有無
endCursor // 100件目のページID
}
nodes { // 取得したい項目を指定
name, // リポジトリの名前
pushedAt, // プッシュされた時間
sshUrl // sshのURL
}
}
}
}
おわりに
最初、構造やドキュメントの見方を理解するのに苦戦しました。。
何度かリクエスト・レスポンスするうちに、雰囲気掴めました。
ドキュメント見ながら、上位のオブジェクトから順に指定してくいくと、クエリ作りやすいかと思います。
APIのリクエスト制限が特殊だったり、ドキュメントが複雑なのでとっつきにくく感じました。
しかし、GraphQLの長所である、リクエストとレスポンスのbodyの書式が同じで、リクエスト時にレスポンスが想像できるのは、可読性やバグを防ぐ意味で大きなメリットだと思いました。
コメント