PHP入門 HTTPクライアントGuzzle

Guzzleとは、HTTP経由で外部の情報/サービスにアクセスするための手段を提供するライブラリです。ここでは、Guzzleライブラリの使用方法について解説しています。

HTTP通信の基本

指定されたアドレスにアクセスして取得したファイルをテキスト表示を例に解説します。

<?php
require './vendor/autoload.php';   //➊

//クライアントを生成
$cli = new GuzzleHttp\Client([     //➋
    'base_uri' => 'https://kcfran.com/',
]);

//リクエストを送信
$res = $cli->request('get','/2024/12/29/php-external-library-composer/');//➌
//取得したコンテンツを出力
print $res->getBody();//➍
実行結果
実行結果

1、autoload.phpをインポートする(❶)

autoload.phpはライブラリを自動ロードするためのコードです。Composerでインストールしたライブラリを利用する際には、あらかじめautoload.phpをインポートします。

2、GuzzleHttp\Clientオブジェクトを生成する(❷)

GuzzleHttp\ClientはGuzzleの中核とも言ううべきクラスで、HTTP通信そのもの(リクエスト/レスポンス)を管理します。コンストラクターには「オプション => 値」の形式で、動作オプションを指定できます。

3、リクエストを送信する(➌)

実際にリクエストを準備するのは、requestメソッドの役割です。

構文:requestメソッド

client::request(string $method [, string $uri [, array $options]]):ResponseInaterface
$methodHTTPメソッド
$uriアクセス先のURI
$options動作オプション

引数$methodには、利用するHTTPメソッドに応じて、get、post、put、patch、deleteなどを指定できます。コンテンツを取得だけであれば、getを指定します。

汎用的なrequestメソッドの代わりに、特定のHTTPメソッドに対応get、postなどのメソッドもあります。
$res = $cli-get(‘/tmp/sample.txt’);

引数$uriは、先ほどClientコンストラクターで指定したbase_uriオプションとの合算で評価されます。

base_uri$uri評価結果
https://example.com/barhttps://example.com/bar
https://example.com/foo/barhttps://example.com/bar
https://example.com/foobarhttps://example.com/bar
https://example.com/foo/barhttps://example.com/foo/bar
https://example.comhttps://www.yahoo.co.jphttps://www.yahoo.co.jp
https://example.com/?foobarhttps://example.com/bar

引数$optionsは、リクエストオプションです。「オプション名=>値」の形式で値を指定できます。

主なリクエストオプション

オプション概要
base_uri基底URI
headersリクエストヘッダー(連想配列)
jsonJSONデータ
form_paramsフォームの値
queryクエリ文字列
bodyリクエスト本体
allow_redirectsリダイレクトを許可するか
auth基本認証([ユーザー名、パスワード]形式の配列)
debugデバッグ情報を出力するか
connect_timeout接続タイムアウト
timeout応答タイムアウト
proxy使用するプロキシサーバー
verifySSL証明書を検証するか
versionHTTPのバージョン

リクエストオプションは、Clientコンストラクター(❷)の動作オプションと合わせて設定してもかまいません。複数のリクエストで共通の設定を利用したい場合には、コンストラクターで設定することで、リクエスト設定を一か所にまとめられます。

4、レスポンスを処理する

requestメソッド(または、get/postなどのメソッド)の戻り値は、サーバーからの応答データを表す「ResponseInterfaceオブジェクト」です。➍では、getBodyメソッドで応答の本体を取得していますが、その他にも「ResponseInterfaceオブジェクト」では、次のメソッドを用意しています。

メソッド概要
getStatusCode()ステータスコード
getHeaders()応答ヘッダー
hasHeader($name)ヘッダー名($name)が存在するか
getHeader($name)指定されたヘッダーの値(配列)
getHeaderLine($name)指定されたヘッダーの値(カンマ区切りの文字列)
getBody()コンテンツ本体

HTTP POSTによる通信

get(HTTP GET)という命令を使ってHTTP通信を行いました。HTTP GETは、主にデータを取得するための命令です。リクエスト時に簡単なデータを送信することもできますが、サイズは制限されます。まとまったデータを送信するには、「HTTP POST」を利用します。

<?php
require './vendor/autoload.php';

//クライアントを生成
$cli = new GuzzleHttp\Client([
    'base_uri' => 'https://kcfran.com/',
]);

//リクエストを送信
$res = $cli->post('/post.php',[
    'form_params' => [
        'name' => '佐々木小太郎'
    ]
]);
print $res->getBody();//結果:こんにちは、佐々木小太郎さん

HTTP POST通信には、postメソッドを利用するだけです(requestメソッドで引数にpostを指定してももかまいません。)。リクエスト本体は、form_paramsオプションに「キー名=>値」形式で引き渡せます。

HTTP GETによる通信

簡単なデータであれば、HTTP GETでも送信できます。その場合は、queryオプションを使用します。

$res = $cli->get('post.php',[
    'query' => [
      'name' => '佐々木小太郎'
    ]
]);

JSONデータを取得する

HTTP経由でデータを受け渡しする場合、JSON(JavaScriptObjectNotation)と呼ばれるデータ形式がよく利用されます。JSONとはJavaScriptのオブジェクトリテラルをもとにしたデータ形式で、その性質上、JavaScriptとの親和性に優れます。

<?php
require './vendor/autoload.php';
$cli = new GuzzleHttp\Client([
    'base_uri' => 'https://kcfran.com/',
]);
$res = $cli->get('/books.json');
$obj = json_decode($res->getBody());
print_r($obj);
stdClass Object
(
 [books] => Array
   (
     [0] => stdClass Object
       (
        [isbn] => 999-1-1111-2222-0
        [title] => 山の上のたぬき物語
        [author] => けちゃふらん
       )
     [1] => stdClass Object
      (
        [isbn] => 999-1-1111-2222-1
        [title] => 巣京
        [author] => けちゃふらん
      ・
      ・
      ・

JSONデータをPHP上で利用できるようにするには、getBodyメソッドで取得した応答本体をjson_decode関数で変換します。json_decode関数は、既定で変換結果をオブジェクトのプロパティとして割り当てます。よって、「books配下の0番目のtitleキー」にアクセスするならば、以下のようにします。

print($obj->books[0]->title);

json_decode関数の第2引数にtrueを渡した場合、変換結果を連想配列として返すことも可能です。

$obj = json_decode($res->getBody(), true);
print $obj['books'][0]['title'];