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
$method | HTTPメソッド |
$uri | アクセス先のURI |
$options | 動作オプション |
引数$methodには、利用するHTTPメソッドに応じて、get、post、put、patch、deleteなどを指定できます。コンテンツを取得だけであれば、getを指定します。
$res = $cli-get(‘/tmp/sample.txt’);
引数$uriは、先ほどClientコンストラクターで指定したbase_uriオプションとの合算で評価されます。
base_uri | $uri | 評価結果 |
---|---|---|
https://example.com | /bar | https://example.com/bar |
https://example.com/foo | /bar | https://example.com/bar |
https://example.com/foo | bar | https://example.com/bar |
https://example.com/foo/ | bar | https://example.com/foo/bar |
https://example.com | https://www.yahoo.co.jp | https://www.yahoo.co.jp |
https://example.com/?foo | bar | https://example.com/bar |
引数$optionsは、リクエストオプションです。「オプション名=>値」の形式で値を指定できます。
主なリクエストオプション
オプション | 概要 |
---|---|
base_uri | 基底URI |
headers | リクエストヘッダー(連想配列) |
json | JSONデータ |
form_params | フォームの値 |
query | クエリ文字列 |
body | リクエスト本体 |
allow_redirects | リダイレクトを許可するか |
auth | 基本認証([ユーザー名、パスワード]形式の配列) |
debug | デバッグ情報を出力するか |
connect_timeout | 接続タイムアウト |
timeout | 応答タイムアウト |
proxy | 使用するプロキシサーバー |
verify | SSL証明書を検証するか |
version | HTTPのバージョン |
リクエストオプションは、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'];