试试用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时需要提供访问令牌。

settings.png

设置→开发者设置→个人访问令牌,然后生成新的令牌。权限应该选择仓库(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错误代码。

从理性的角度考虑,当然应该区分对待。

广告
将在 10 秒后关闭
bannerAds