カテゴリー: BackEnd

LaravelでHTTP通信

はじめに

外部サーバとの連携など、HTTPリクエストを投げたいケースが有るとおもいます。今回は Guzzle を使ってHTTPリクエストを投げる方法を紹介します。

インストール

ルートディレクトリで以下のコマンドを実行します。

$ composer require guzzlehttp/guzzle

基本的な使い方

それでは、実際にリクエストを投げる方法を見ていきます。

GETでリクエストを投げる

http://example.comにGETでリクエストを投げるには以下のように記述します。

<?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);
    }
}

使い方についてはコードを見ればわかると思います。オプションについてはよく使いそうなものをいくつか紹介します。詳細はこちらをご確認ください。

リクエストヘッダーを指定

リクエストヘッダーにつけるパラメータは配列で指定できます。

<?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 に配列を指定します。

<?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(無制限)となっています

<?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 に配列を指定します。

<?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 がスローされます。

<?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の使い方を紹介しました。

おすすめ書籍

     

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: phplaravel

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前