下記のようなcurlコマンドをLaravelから実行するためにはどうするのか、調べる機会があったので、手順をまとめてみたいと思います。
curl -X POST https://example.com/api \
-d '{
"sample": "sample data"
}' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer api-key"
下記のようなJSON形式のレスポンスが戻ってくることを想定します。
{
"answer": "sample-answer",
}
環境変数の設定
APIのURLとAPIキーはコード内に書かずに、.env
ファイルにて設定します。以下のように.env
ファイルに変数を追加します。
API_URL=https://example.com/api
API_KEY=api-key
次にconfig/app.php
などのコンフィグファイルに、下記を追加します。
'api_url' => env('API_URL'),
'api_key' => env('API_KEY'),
これでconfig
関数で下記のようにURLやAPIキーを取得することができます。
$api_url = config('app.api_url');
$api_key = config('app.api_key');
curlに渡すデータを用意する
curl
コマンドにはいくつかの情報を渡す必要があります。
- メソッド(GETやPOSTなど)
- APIのURL
- データ
- ヘッダー
メソッド
メソッドは"GET"や"POST"などの文字列として渡すことができます。今回の例では"POST"を渡します。
APIのURL
上記で設定した環境変数を取得します。
$api_url = config('app.api_url');
データ
データは一旦配列として作成して、JSONにエンコードします。
$data = [ "sample" => "sample data" ];
この時、データに全角文字などが含まれる場合、URLエンコードをしないと正しく認識されないことがあるので、下記のようにURLエンコードをしてあげることが必要な場合があります。
$data = [ "sample" => urlencode("サンプルデータ") ];
JSONへのエンコードには下記の関数を使います。
$data = json_encode($data);
ヘッダー
ヘッダーは配列にします。APIキーは上記で設定した環境変数を取得して使います。
$api_key = config('app.api_key');
$headers = [ "Content-Type: application/json", "Authorization: Bearer " . $api_key ];
curlセッションを初期化して設定する
まず、curlセッションを初期化して、curlハンドルを取得します。
$curl_handle = curl_init();
次にcurlコマンドの実行に必要な情報をcurl_setopt
関数を使って設定していきます。
curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl_handle, CURLOPT_URL, $api_url);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $headers);
CURLOPT_CUSTOMREQUEST
などのオプションについての詳細は下記で確認できます。
https://www.php.net/manual/ja/function.curl-setopt.php
curlコマンドを実行する
下記のように、コマンドを実行して、レスポンスを取得します。
$json_response = curl_exec($curl_handle);
ただし、下記のCURLOPT_RETURNTRANSFER
をtrue
に設定しておかないと、curl_exec
は成功・失敗を表すboolを戻すので、レスポンスの内容を取得できません。下記の設定をしておくことで、curl_exec
の戻り値がJSON形式の文字列になるので、忘れずに設定しましょう。
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true); // curl_exec()の結果を文字列にする
レスポンスを取得したら、curlセッションをクローズします。
curl_close($curl_handle);
取得したレスポンスのデータにアクセスする
上記で取得した$json_response
をデコードします。
$decoded_data = json_decode($json_response, true);
下記のようにデータにアクセスできます。
$answer = $decoded_data->answer;
まとめ
上記のコードは、コントローラのメソッドとして記述してもいいし、ヘルパーメソッドとして記述してどこからでもアクセスできるようにしても良いと思います。