はじめに
外部サーバとの連携など、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 namespace App\Http\Controllers; use GuzzleHttp\Client; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class HttpRequestsController extends Controller { public function sendGet() { $client = new Client(['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); } public function sendGet2() { $client = new Client(['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 namespace App\Http\Controllers; use GuzzleHttp\Client; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class HttpRequestsController extends Controller { public function sendGet() { $client = new Client(['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 namespace App\Http\Controllers; use GuzzleHttp\Client; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class HttpRequestsController extends Controller { public function sendGet() { $client = new Client(['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 namespace App\Http\Controllers; use GuzzleHttp\Client; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class HttpRequestsController extends Controller { public function sendGet() { $client = new Client(['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 namespace App\Http\Controllers; use GuzzleHttp\Client; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class HttpRequestsController extends Controller { public function sendPost() { $client = new Client(['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 namespace App\Http\Controllers; use GuzzleHttp\Client; use GuzzleHttp\Psr7\str; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class HttpRequestsController extends Controller { public function sendGet() { $client = new Client(['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の使い方を紹介しました。