person t-kobayashi

Laravelからcurlリクエストを送信した際の手順

calendar_today 2021年09月01日 update 2021年09月01日
Facebook Twitter LINE はてなブックマーク Pocket

下記のような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_RETURNTRANSFERtrueに設定しておかないと、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;

まとめ

上記のコードは、コントローラのメソッドとして記述してもいいし、ヘルパーメソッドとして記述してどこからでもアクセスできるようにしても良いと思います。

関連記事

Laravelの記事一覧を見る

Laravelの質問

dosanko が3年前に投稿

質問日時 2021年05月26日

search