ITエンジニアSAIの技術関連備忘録

技術的な内容を忘れないようにメモ....

phpでCurlを利用してWebAPIを叩く方法

1.環境

  Mac macOS Sierra
  Vagrant1.9.3(CentOS 7.1)
   PHP5.4
   Fuelphp1.7.3
 

 
/**
* APIリクエストを行い結果を配列で受け取る
*
* @method sendApi
* @param [type] $url [description]
* @param [type] $request_param [description]
* @param [type] $option [description]
* @return [type] [description]
*/
public static function sendApi($url, $request_param, $options=null)
{
     $result = null;
 
     Log::debug($url);
     Log::debug(var_export($request_param, true));
 
     if (!empty($url))
     {
          $curl = curl_init(); //①
 
          if($options != null)
          {
               curl_setopt_array($curl, $options); //②
          }
 
          $result = curl_exec($curl); //③
          $getInfo = curl_getinfo($curl); //④
 
          $errno = curl_errno($curl); //⑤
          Log::debug("★Error Number : ".$errno);
    
          if(CURLE_OK == $errno)
          {
               //ヘッダサイズ除去
               $result = substr($result, $getInfo["header_size"]); //⑥
               Log::debug(var_export($result, true));
          } else {
               $result = null;
          }
 
          curl_close($curl);
          //Json形式から配列に変換
          //$result = json_decode($body, true);
     }
 
     return $result;
}
 
 
3.解説

 
① curl_init()
セッションを初期化する。
これは、必ず最初に行う。その戻り値として受け取ったセッションをパラメータに渡して以降の関数を呼び出す。
 
② curl_setopt_array($curl, $options)
curlでHTTPリクエストする際に付与するヘッダー情報やリクエストURL、リクエストパラメータなどを設定する。
上記の関数は配列でまとめて渡す場合の関数
ここに渡す場合は、curl_setoptを使用する。
 
③ curl_exec($curl)
HTTPリクエストを実行する。
 
④ curl_getinfo($curl)
リクエストした結果情報を受け取る。
この中にレスポンスボディも入っているので、その部分を取得することでリクエスト結果が取得できる。
抜き出し方は⑥を参照
 
⑤ curl_errno($curl)
リクエストの結果ステータスを取得することができる。
エラーが発生した場合はエラー情報なども取得が可能。
ソースコードでは、これをチェックしてOKならばレスポンスボディの値を取得する処理を実装している。
 
4.補足

 
以下はCurlOptionの参考までに
※詳しくはPHPリファレンスを参照
 
$curl_opt = array(
     CURLOPT_URL => $url,
     CURLOPT_POSTFIELDS => http_build_query($request_param),
     CURLOPT_RETURNTRANSFER => TRUE,
     CURLOPT_HEADER => TRUE,
     CURLOPT_POST => TRUE,
     CURLOPT_SSL_VERIFYPEER => FALSE,
     CURLOPT_HTTPHEADER => $header
);