Furudateのブログ

プログラミングやネットワーク系の知識・技術がメインのブログ。技術メモ帳的な感じになるかと。岩手から発信していきます。

【PHP】CakePHP2でcurlを使ってREST APIを叩く処理

こんにちは。

最近、自作したAPICakePHPを使って叩こうとしたのですが、何を使えばいいか迷いました。
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などが入ります。リクエストを何で送るかですね。

どこのAPIに送るかです。Users.jsonなど、CakePHPでいうコントローラー名になると思います。

  • $query

主にデータ取得の際、何か指定する場合に値が入ります。

  • $data

POSTなどのデータを送る場合にその送るデータが入ります。

curlの基本的な流れ

curl は基本的に以下のように使います。

  1. curl_init()で初期化
  2. オプションを設定
  3. curl_exec()で実行
  4. curl_close()で終了

ここで重要なのはオプションについてです。
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レスポンスの情報を見ることが出来ます。
接続時間とかあるので何かを検証するときなどは便利そうです。

今回は以上です。
それでは。

参考にさせていただいたサイト

PHP: 基本的な curl の使用法 - Manual

PHP: curl_setopt - Manual

PHPメモ : file_get_contentsの代替にcURLを使う – Mach3.laBlog

phpのcurl ライブラリの使い方のHTTP実例いっぱい - それマグで!