前言
本文實作一個可以讀取 GitHub API 的套件。
專案目錄
專案目錄如下:
1 2 3 4 5 6 7 8 9
| |- github-api/ |- dev/ |- src/ |- Github.php |- vendor/ |- composer.json |- composer.lock |- index.php
|
使用 GitHub API
GitHub REST API v3. 提供詳細的文件供開發者使用。
取得儲存庫資料
取得使用者資料
本文將使用以上兩個方法實作一個可以讀取 GitHub API 的套件。
安裝相依套件
讀取 GitHub API 會需要發送 HTTP
請求以及獲取響應,所以安裝 Guzzle
套件。
1 2
| cd github-api/github-api-dev composer require guzzlehttp/guzzle
|
實作
在 src
資料夾中新增一個 Github.php
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| namespace Memo;
class Github { protected $client; protected $url; protected $option; protected $exception; protected $paginate;
public function __construct() { $this->client = new \GuzzleHttp\Client(); $this->url = 'https://api.github.com'; }
public function option($option) { $this->option = $option;
return $this; }
public function showException() { $this->exception = true;
return $this; }
public function request($type, $name, $target = null) { $this->url .= '/' . $type . '/' . $name;
if ($target) $this->url .= '/' . $target;
return $this; }
public function paginate($per_page = 10, $page = null) { $this->paginate = '?per_page=' . $per_page;
if ($page) $this->paginate .= '&page=' . $page;
return $this; }
public function getBody() { if (!$this->getResponse()) return;
return (object) [ 'url' => $this->url . $this->paginate, 'response' => json_decode($this->getResponse()->getBody()) ]; }
public function getHeaderLine($field) { if (!$this->getResponse()) return;
return (object) [ 'url' => $this->url . $this->paginate, 'response' => json_decode($this->getResponse()->getHeaderLine($field)) ]; }
protected function getResponse() { try { $response = $this->client->get($this->url . $this->paginate, $this->option); } catch (\GuzzleHttp\Exception\ClientException $e) { $response = ($this->exception) ? $e->getResponse() : null; }
return $response; } }
|
使用
新增一個 index.php
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| require 'vendor/autoload.php'; require 'src/Github.php';
$github = new \Memo\Github();
$github ->request('repos', 'laravel/laravel') ->option([ 'headers' => [ // 認證 'Authorization' => 'token 84411234372912342f351234dc9712343b301234', // 文本格式 'Accept' => 'application/vnd.github.mercy-preview+json' ] ]) ->paginate() ->showException();
var_dump($github->getHeaderLine('X-RateLimit-Remaining'));
var_dump($github->getBody());
|
結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| object(stdClass) ["url"]=> string(63) "https://api.github.com/repos/laravel/laravel/topics?per_page=10" ["response"]=> int(4990) } object(stdClass) ["url"]=> string(63) "https://api.github.com/repos/laravel/laravel/topics?per_page=10" ["response"]=> object(stdClass) ["names"]=> array(3) { [0]=> string(3) "php" [1]=> string(9) "framework" [2]=> string(7) "laravel" } } }
|
程式碼