これはユアマイスター Advent Calendar 2018の7日目の記事です。
以前、QiitaのAPIv2を使用して自身の記事取得の記事を書いた時にPHPのcURL関数を使ってAPIを作成しました。
業務の中でAPIを触る事があり、そこでCakePHPのHttpClientクラスを使用していたのをみて、置き換えたらどうなるのか、興味本位で構築してみたら非常に簡単だったので、備忘録として記載します。
##HttpClientを使用したOAuth認証API
<?php
use Cake\Network\Http\Client;
##OAuth認証メソッド
private function httpClient($accessToken, $url)
{
$http = new Client([
'headers' => [
'Authorization' => 'Bearer ' . $accessToken
]
]);
$response = $http->get($url);
return $response;
}
HttpClientクラスをインスタンス化する際に、headerオプションを使用し、Authorizationにtokenを指定。
インスタンス化したHttpClientクラスのgetメソッドに、リクエスト先URLを指定する事でデータを取得する。
参考:[https://book.cakephp.org/3.0/ja/core-libraries/httpclient.html]
これで簡単にOAuth認証ができます。
そのままコピペで使えると思うので、使用したい方は是非。
##cURLを使用したOAuth認証API
private function curl($accessToken, $url)
{
$ch = curl_init();
$options = [
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . $accessToken
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
];
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
curl_init()
で初期化し、curl_setopt
のCURLOPT_HTTPHEADER
オプションにtokenを指定。
CURLOPT_CUSTOMREQUEST
オプションにHTTPメソッドを指定、CURLOPT_RETURNTRANSFER
オプションをTRUEとして文字列として値を返すよう指定。
curl_exec
でcurlを実行。
参考:[http://php.net/manual/ja/function.curl-setopt.php]
比較対象としてcURL関数を使用した場合も記載しました。
##処理速度が早いのはどっち
PHPのmicrotime関数を使用してresponseが返ってくるまでを計測してみました。
実装コードはこちらです。
$start = microtime(true);
$this->httpClient($accessToken, $url);
// or
$this->curl($accessToken, $url);
debug(floor(1000 * sprintf("%.10f", microtime(true) - $start)));
処理の流れとしては、
- 計測開始位置を定義
- APIを呼び出す
- 計測開始位置からdebugまでを引き、sprintf関数を使用して小数点以下を10桁表示。
単位m/sで求めたい為、1000を掛ける。
floor関数を使用して小数点以下を切り捨て。
※debug部分は出力すれば他の関数でも良い
あまり変わりませんでした。
誤差の範囲内という感じでしょうか?
##まとめ
直感的に記述量の少なさからHttpClientクラスを使用した実装の方が良い気が…
もっとHttpClientクラスとcURLがどういうクラス、または関数か、を知れば明確な選択が出来ると思うので、深掘りしてみます。
もしHttpClientクラスの方が良い、もしくは、cURL関数が良い、があれば理由や根拠付きで是非コメント下さい!
##おまけ
Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
p.s.今年の2月までは溶接職人でした。ガッツ系エンジニアとしてやらせて頂いております。