试试用PHP从GitHub API v4调用
尽管我经常听到有人说要”调用” API,但是因为这听起来很痛,所以我不喜欢它…。
嗯,如果想要使用GitHub API做些什么,现在有个名为v4的GraphQL可供使用。
https://developer.github.com/v4/
我想用PHP来调用这个东西。
当使用带有贝拉令牌的JSON,包含GraphQL查询,并通过端点进行POST请求时,GitHub API v4会返回JSON数据。如果发送的是Mutation而不是Query,那就是用于更新操作。但在这次例子中,只进行获取操作。
尝试写一个GraphQL查询。
既然有GraphQL API Explorer,那我们就在这里写吧。
暫時先依照常見的模式,我試著寫了一個查詢,可以獲取特定使用者的存儲庫名稱和URL列表。
{
user(login: "mifumi323") {
repositories(first: 10) {
nodes {
name
url
}
}
}
}
对于从未接触过GraphQL的人,他们或许也能大致理解吧。这是一个查询,其目的是获取名为”mifumi323″的用户的仓库中前十个项目的名称和URL。
因为返回的JSON内容一眼就能看出来,所以省略了。
获取Bearer令牌
我不知道是GitHub API的要求还是GraphQL的要求,但在调用API时需要提供访问令牌。
设置→开发者设置→个人访问令牌,然后生成新的令牌。权限应该选择仓库(repo)。生成的令牌只会显示一次,所以记得要记下来。
发表
既经准备好了查询和令牌,现在可以开始编写用于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不接受原始查询,所以将查询内容包含在JSON的query字段中。同时,也要指定Content-type。
然后,将Bearer令牌放入Authorization中并进行POST请求。
GitHub在v3版本时也是如此,如果不在头文件中添加User-Agent将会出现错误。因为似乎没有特定的使用情况,所以建议随便输入一个安全的字符串即可。
错误处理等
在GraphQL中,当出现错误时,会将错误信息存储在data字段的errors字段中。然而,在进行GraphQL解析之前的错误(例如身份验证错误)等,会返回HTTP错误代码。
从理性的角度考虑,当然应该区分对待。