Issei.M's Techlog

Web/iOS エンジニアの僕が技術関連のメモ等をつらつらと。主に Symfony について書いています。

[Symfony] Buzz\Browser でお手軽 HTTP リクエスト

HTTP リクエストを送る PHP ライブラリは数多くありますが、中でも Buzz\Browser が使いやすかったので Symfony での使用例をご紹介。

インストール

いつも通り、Composer でインストールします。作者は Assetic で有名な Kirs Wallsmith さんです。

php composer.phar require kriswallsmith/Buzz:dev-master

折角 Symfony で使うのでサービスコンテナに登録しちゃいます。

# services.yml
services:
    buzz.client.curl:
        class:  Buzz\Client\Curl
        public: false
        # 証明書の検証が必要な場合は calls を削除
        calls:
          - [ setVerifyPeer, [false] ]
    buzz.browser:
        class:     Buzz\Browser
        arguments: ["@buzz.client.curl"]

使い方はこんな感じ

適当なコントローラに実装します。

$browser = $this->get('buzz.browser'); # ContainerInterface::get()

# 診断くん
$response = $browser->get('http://taruo.net/e/');
if (!$response->isSuccessful()) {
    throw new HttpException($response->getReasonPhrase(), $response->getStatusCode());
}

$content = $response->getContent(); # 診断くんの HTML ソース

返却された Response オブジェクトの::isSuccessful()でリクエスト結果の成否を調べる事ができます。 エラーの際は::getStatusCode(),::getReasonPhrase()で内容の確認しましょう。
本文の取得は::getContent()です。

またBrowser::get()の第2引数には任意のリクエストヘッダを配列で指定する事ができます。

$browser->get('http://taruo.net/e/', array('User-Agent', 'buzz.browser'));

::get()の他にも::post()::put()等基本的なものが揃っています。

cURL が使えない環境の人は...

file_get_contentsもサポートされているので安心。サービスコンテナの設定を次のように変更すればOKです。

# services.yml
services:
    buzz.client.file_get_contents:
        class:  Buzz\Client\FileGetContents
        public: false
        calls:
          - [ setVerifyPeer, [false] ]
    buzz.browser:
        class:     Buzz\Browser
        arguments: ["@buzz.client.file_get_contents"]

もちろん実装部のソースコードを変える必要はありません。DI コンテナさまさまです♪