はじめに
外部サーバとの連携など、HTTPリクエストを投げたいケースが有るとおもいます。今回は Guzzle を使ってHTTPリクエストを投げる方法を紹介します。
インストール
ルートディレクトリで以下のコマンドを実行します。
1 | $composer require guzzlehttp/guzzle |
基本的な使い方
それでは、実際にリクエストを投げる方法を見ていきます。
GETでリクエストを投げる
http://example.comにGETでリクエストを投げるには以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php namespaceApp\Http\Controllers; useGuzzleHttp\Client; useIlluminate\Http\Request; useApp\Http\Controllers\Controller; classHttpRequestsControllerextendsController { publicfunctionsendGet() { $client=newClient(['base_uri'=>'http://example.com/']); $path='index.html'; $options=['http_errors'=>false]; $response=$client->request('GET',$path,$options); // status code $statusCode=$response->getStatusCode()->getContents(); // response body $responseBody=$response->getBody()->getContents(); return$this->response($responseBody); } publicfunctionsendGet2() { $client=newClient(['base_uri'=>'http://example.com/']); $path='index.html'; $options=['http_errors'=>false]; // 以下のようにメソッド名でも実行可能 $response=$client->get($path,$options); $responseBody=$response->getBody()->getContents(); return$this->response($responseBody); } } |
使い方についてはコードを見ればわかると思います。オプションについてはよく使いそうなものをいくつか紹介します。詳細はこちらをご確認ください。
リクエストヘッダーを指定
リクエストヘッダーにつけるパラメータは配列で指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php namespaceApp\Http\Controllers; useGuzzleHttp\Client; useIlluminate\Http\Request; useApp\Http\Controllers\Controller; classHttpRequestsControllerextendsController { publicfunctionsendGet() { $client=newClient(['base_uri'=>'http://example.com/']); $path='info.html'; $options=[ 'http_errors'=>false, 'headers'=>[ 'User-Agent' =>'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36', 'Cache-Control' =>'max-age=0', 'Referer' =>'http://www.example.com/', 'Connection' =>'keep-alive' ], ]; $response=$client->request('GET',$path,$options); $responseBody=$response->getBody()->getContents(); return$this->response($responseBody); } } |
クエリパラメータを指定
クエリパラメータを指定するには query に配列を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php namespaceApp\Http\Controllers; useGuzzleHttp\Client; useIlluminate\Http\Request; useApp\Http\Controllers\Controller; classHttpRequestsControllerextendsController { publicfunctionsendGet() { $client=newClient(['base_uri'=>'http://example.com/']); $path='info.html'; $options=[ 'http_errors'=>false, 'query'=>['hoge'=>'fuga'], ]; $response=$client->request('GET',$path,$options); $responseBody=$response->getBody()->getContents(); return$this->response($responseBody); } } |
timeout時間を指定
接続タイムアウトは connection_timeout を指定、応答待タイムアウトは timeout を指定します。どちらも秒数(float)で指定でき、デフォルトは0(無制限)となっています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php namespaceApp\Http\Controllers; useGuzzleHttp\Client; useIlluminate\Http\Request; useApp\Http\Controllers\Controller; classHttpRequestsControllerextendsController { publicfunctionsendGet() { $client=newClient(['base_uri'=>'http://example.com/']); $path='info.html'; $options=[ 'http_errors'=>false, 'timeout'=>10, 'connect_timeout'=>10, ]; $response=$client->request('GET',$path,$options); $responseBody=$response->getBody()->getContents(); return$this->response($responseBody); } } |
POSTでリクエストを投げる
POSTでJSONを送るには json に配列を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php namespaceApp\Http\Controllers; useGuzzleHttp\Client; useIlluminate\Http\Request; useApp\Http\Controllers\Controller; classHttpRequestsControllerextendsController { publicfunctionsendPost() { $client=newClient(['base_uri'=>'http://example.com/']); $path='info.html'; $options=[ 'http_errors'=>false, 'json'=>['hoge'=>'fuga'], ]; $response=$client->request('POST',$path,$options); $responseBody=$response->getBody()->getContents(); return$this->response($responseBody); } } |
例外処理
オプションの http_errors に false を指定していない場合 ClientException がスローされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php namespaceApp\Http\Controllers; useGuzzleHttp\Client; useGuzzleHttp\Psr7\str; useIlluminate\Http\Request; useApp\Http\Controllers\Controller; classHttpRequestsControllerextendsController { publicfunctionsendGet() { $client=newClient(['base_uri'=>'http://example.com/']); $path='index.html'; $options=['http_errors'=>false]; $response=$client->request('GET',$path,$options); try{ $responseBody=$response->getBody()->getContents(); }catch(ClientException$e){ \Log::debug(str($e->getResponse()); } return$this->response($responseBody); } } |
さいごに
LaravelでHTTPリクエストを投げる方法としてGuzzleの使い方を紹介しました。