【PHP】CakePHP2でcurlを使ってREST APIを叩く処理
こんにちは。
最近、自作したAPIをCakePHPを使って叩こうとしたのですが、何を使えばいいか迷いました。
PHPを使って外部のリソースを取得したりAPIを叩くとき、file_get_contentを使う方法があります。
しかし、パフォーマンス的にはcURLを使ったほうが良いみたいです。
そこで、今回はREST APIを叩く場合にcURLを使う方法をメモしておきます。
cURLを使ってAPIを叩く関数を作成
まずはRESTに対応した関数を作成します。基本的にこの関数を各コントローラーから呼び出してAPIを叩く感じになります。
関数は AppController とかに書きましょう。
<?php class AppController extends Controller { public function api_rest($method, $uri, $query = null, $data = null){ $ch = curl_init(); $basic_url = "http://localhost/sample_api/"; $options = array( CURLOPT_URL => $basic_url.$uri.'?'.$query, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS => http_build_query($data), // URLエンコードして application/x-www-form-urlencoded でエンコード。URLエンコードしないとmultipart/form-dataになる ); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); // 第2引数をtrueにすると連想配列で返ってくる curl_close($ch); return $response; } } ?>
基本的にcurlの公式マニュアル(こちら)のExampleに書いてあるのを参考にした(パクった)のですが、一応上から説明していきます。
引数について
- $method
GET, POST, PUT, DELETEなどが入ります。リクエストを何で送るかですね。
- $uri
どこのAPIに送るかです。Users.jsonなど、CakePHPでいうコントローラー名になると思います。
- $query
主にデータ取得の際、何か指定する場合に値が入ります。
- $data
POSTなどのデータを送る場合にその送るデータが入ります。
curlの基本的な流れ
curl は基本的に以下のように使います。
ここで重要なのはオプションについてです。
curl_setopt()で一つひとつオプションを指定するやり方もあるのですが、今回は curl_setopt_array() で一気にオプションを指定しています。
オプションについて
ここで使っているオプションについてメモしておきます。
その他にもたくさんのオプションがあるのでこちらを参照してください。
- CURLOPT_URL
- アクセス(APIの)するURL
- CURLOPT_HEADER
- ヘッダを出力するか。レスポンスヘッダを見たい場合はtrueにしてください。
- CURLOPT_RETURNTRANSFER
- curl_execの戻り値を文字列にする
- CURLOPT_TIMEOUT
- タイムアウト時間の設定
- CURLOPT_CUSTOMREQUEST
- HTTPメソッドのカスタムリクエストを設定出来ます。ここでリクエストの種類を指定
- CURLOPT_POSTFIELDS
- 送信するデータ
作成した関数を利用する
さて、関数を作成したらあとはこの関数を利用すればOKです。
以下のようにして各コントローラーで利用しましょう。
$res = $this->api_rest('POST', 'users.json', "", $this->request->data);
これでREST APIに対応出来ました。
ちなみに、curl_close()する前に curl_getinfo($ch) とすることでHTTPレスポンスの情報を見ることが出来ます。
接続時間とかあるので何かを検証するときなどは便利そうです。
今回は以上です。
それでは。