Composerを使ってGuzzle HTTPクライアントをインストール、HTTPリクエストしてみた

はじめに
PHPのCompoerへの理解を深めるために、ライブラリをインストールしてプログラミングしてみます。今回はGuzzle HTTPクライアント
をインストールして、HTTPリクエストしてみました。
開発環境
ソフトウェア | バージョン |
---|---|
macOS | 14.2 |
php | 8.3.2 |
composer | 2.6.6 |
guzzlehttp/guzzle とは
https://packagist.org/packages/guzzlehttp/guzzle
guzzlehttp/guzzle
とは、Comoser
でインストール可能な PHP の HTTP client library
です。公式ページによれば、次のようにしてHTTPリクエストを行うことが可能になります。
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
echo $response->getStatusCode(); // 200
echo $response->getHeaderLine('content-type'); // 'application/json; charset=utf8'
echo $response->getBody(); // '{"id": 1420053, "name": "guzzle", ...}'
// Send an asynchronous request.
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
echo 'I completed! ' . $response->getBody();
;
})
$promise->wait();
guzzlehttp/guzzle のインストール
適当なワーキングディレクトリを作成して、そこへ移動してから
composer require guzzlehttp/guzzle
を実行します。
$ composer require guzzlehttp/guzzle
./composer.json has been created
Running composer update guzzlehttp/guzzle
Loading composer repositories with package information
Updating dependencies
Lock file operations: 8 installs, 0 updates, 0 removals
- Locking guzzlehttp/guzzle (7.8.1)
- Locking guzzlehttp/promises (2.0.2)
- Locking guzzlehttp/psr7 (2.6.2)
- Locking psr/http-client (1.0.3)
- Locking psr/http-factory (1.0.2)
- Locking psr/http-message (2.0)
- Locking ralouphie/getallheaders (3.0.3)
- Locking symfony/deprecation-contracts (v3.4.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 8 installs, 0 updates, 0 removals
- Installing symfony/deprecation-contracts (v3.4.0): Extracting archive
- Installing psr/http-message (2.0): Extracting archive
- Installing psr/http-client (1.0.3): Extracting archive
- Installing ralouphie/getallheaders (3.0.3): Extracting archive
- Installing psr/http-factory (1.0.2): Extracting archive
- Installing guzzlehttp/psr7 (2.6.2): Extracting archive
- Installing guzzlehttp/promises (2.0.2): Extracting archive
- Installing guzzlehttp/guzzle (7.8.1): Extracting archive
2 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
4 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^7.8 for guzzlehttp/guzzle
実行結果の通り、guzzlehttp/guzzle
に依存するライブラリも同時にインストールされていることがわかります。
インストール後のディレクトリ
composerを使ってライブラリをインストールすると、composer.json
やcomposer.lock
といったファイルが生成されます。そしてvendor
ディテクトりに、ライブラリが格納されます。
$ tree -L 2 9:02:57
.
├── composer.json
├── composer.lock
└── vendor
├── autoload.php
├── composer
├── guzzlehttp
├── psr
├── ralouphie
└── symfony
composer.json
生成された composer.json
パッケージのバージョンがキャレット演算子で指定されています。これは、次のメジャーバージョンまでのすべての変更を利用可能にするものです。下記の場合
>=7.8 <8.0
に相当します。
{
"require": {
"guzzlehttp/guzzle": "^7.8"
}
}
Guzzle HTTPクライアントを使ったリクエスト
それでは実際にPHPでGuzzle HTTPクライアントを使ったテストを行います。
サンプルコードその1
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
echo $response->getStatusCode();
echo $response->getHeaderLine('content-type');
echo $response->getBody();
解説
このようにGuzzle
HTTPクライアントを使うことで、HTTPリクエストをわかりやすく記述することができます。
require 'vendor/autoload.php';
はオートローダーという仕組みで、インストールしたパッケージから外部ファイルやクラスなどを自動で読み込んでくれ流ため、いちいち必要なクラスを取り込むために
include
や require
で記述せずに済みます。 use GuzzleHttp\Client;
で名前空間を指定して、クラスやメソッドを使いやすくします。
サンプルコードその2
今度は、PSR-7リクエストを使って非同期でHTTPリクエストを実行してみます。
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
$client = new Client();
$request = new Request('GET', 'http://apppppp.com/jojo.json');
$promise = $client->sendAsync($request)->then(function ($response) {
// 非同期で実行される
echo '②I completed! ' . $response->getBody();
});
echo "①先に処理する\n";
$promise->wait();
echo "③待ってから処理する\n";
解説
sendAsync
で非同期でHTTPリクエストを投げ、レスポンスが完了したところでthen
メソッド内のクロージャ(無名関数)が実行されます。ですから、echo "①先に処理する\n";
が先に実行されるはずです。その後の記述
$promise->wait();
では、非同期リクエストが完了するまで待機します。ですから、クロージャが実行された後に、echo "③待ってから処理する\n";
が実行されるわけです。
よって、このプログラムを実行すると、次のような結果となるはずです。
$ php main.php
①先に処理する
②I completed! {
"name":"Jyotaro",
"stand":"The World"
}
③待ってから処理する
関連記事
- PHP で Slim を使ったルーティング
- Androidアプリ開発でhttpへアクセスできないネットワークエラー対処
- macOSにLaravelをインストールして開発環境を整える
- ESP32でHTTPSアクセス、ただし証明書検証なし