Help us understand the problem. What is going on with this article?

OAuth認証APIが簡単に書けた!

More than 1 year has passed since last update.

これはユアマイスター 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_setoptCURLOPT_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)));

処理の流れとしては、
1. 計測開始位置を定義
2. APIを呼び出す
3. 計測開始位置からdebugまでを引き、sprintf関数を使用して小数点以下を10桁表示。
 単位m/sで求めたい為、1000を掛ける。
 floor関数を使用して小数点以下を切り捨て。

※debug部分は出力すれば他の関数でも良い

実行結果

スクリーンショット 2018-12-06 18.20.15.png

あまり変わりませんでした。
誤差の範囲内という感じでしょうか?

まとめ

直感的に記述量の少なさからHttpClientクラスを使用した実装の方が良い気が…

もっとHttpClientクラスとcURLがどういうクラス、または関数か、を知れば明確な選択が出来ると思うので、深掘りしてみます。
もしHttpClientクラスの方が良い、もしくは、cURL関数が良い、があれば理由や根拠付きで是非コメント下さい!

おまけ

Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
p.s.今年の2月までは溶接職人でした。ガッツ系エンジニアとしてやらせて頂いております。

tatsuo-iriyama
Web Engineer|96'|高卒|前職:溶接工|2019-01〜ユアマイスター株式会社|
yourmystar
サービス産業のIT化プラットフォーム「ユアマイスター」と大切なものをもっと大切にするメディア「ユアマイスター スタイル」を運営するスタートアップです。
http://corp.yourmystar.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした