さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

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

f:id:y_saiki:20171025002627j:plain

目次

 

1.環境

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

2.サンプルコード

/**
* 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.解説

3-1. 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
);