APIを「叩く」って言い方、よく聞くけど、痛そうだから好きじゃないのよね…。
さて、GitHubのAPI使って何かやろうと思ったら、今はv4のGraphQLなんてのがあるんですね。
https://developer.github.com/v4/
こいつをPHPから呼び出してみようというわけです。
GitHub API v4は、GraphQLのクエリを含んだJSONを、ベアラートークンを付けて、エンドポイントにPOSTすると、JSONデータが返ってくる、という仕組みになっています。QueryじゃなくMutationを投げたら更新らしいですが、今回は取得だけやってみます。
GraphQLのクエリを書いてみる
GraphQL API Explorerなんてのがあるので、ここで書いてみましょう。
とりあえず、よくあるパターンで、特定ユーザーのリポジトリの名前とURLの一覧を取得するクエリを書いてみました。
{
user(login: "mifumi323") {
repositories(first: 10) {
nodes {
name
url
}
}
}
}
GraphQL見たことのない人でも何となくわかるんじゃないでしょうか。「mifumi323」というユーザーのリポジトリの最初の10件の名前とURLを取得するクエリです。
返ってくるJSONも見りゃわかる内容なので、省略します。
ベアラートークンを取得する
GitHub APIの要件なのかGraphQLの要件なのか知りませんが、APIを呼び出すときにはベアラートークンが必要です。
Settings→Developer settings→Personal access tokensと進んでいって、Generate new tokenしましょう。scopeはrepoでいいはず。発行したトークンは一度しか表示されないので、忘れずにメモしておきましょう。
POSTする
クエリとトークンがそろったので、POSTするPHPプログラムを書いてみます。$tokenと$queryにはさっき作ったやつを入れましょう。
<?php
$token = 'ここにトークンを書いてね';
$query = 'ここにクエリを書いてね';
$options = [
'http' => [
'method' => 'POST',
'header' => [
'User-Agent: My User Agent',
'Authorization: bearer '.$token,
'Content-type: application/json; charset=UTF-8',
],
'content' => json_encode(['query' => $query]),
],
];
$context = stream_context_create($options);
$contents = file_get_contents('https://api.github.com/graphql', false, $context);
var_dump(json_decode($contents));
file_get_contentsって便利ですね。stream_context_createでPOSTするコンテンツやらヘッダやらを用意しています。
contentはクエリそのままだと受け付けないので、queryフィールドにクエリの内容を含んだJSONにしておきます。それに合わせて、Content-typeも指定しておきます。
そして、ベアラートークンをAuthorizationに入れてPOSTします。
GitHubはv3の頃もそうでしたが、ヘッダにUser-Agentを入れておかないとエラーになります。特に何かに使っているわけでもないようなので、適当に無難な文字列を入れておくといいかと思います。
エラー処理など
GraphQLのエラーは、dataフィールドがnullになってerrorsフィールドが入ってきます。ただし、GraphQLをパースする前のエラー、例えば認証エラーなどの場合は、HTTPのエラーコードが返ってきます。
理屈を考えれば当たり前ですが、区別して扱うようにしましょう。