4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ユアマイスターAdvent Calendar 2018

Day 7

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

Last updated at Posted at 2018-12-06

これはユアマイスター 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月までは溶接職人でした。ガッツ系エンジニアとしてやらせて頂いております。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?