猫でもわかるWebプログラミングと副業

本業Webエンジニア。副業でもWebエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

PHPのHTTPクライアントライブラリ Guzzle を使うときに知っておきたいこと

f:id:yoshiki_utakata:20211226162557p:plain

Guzzle とは

HTTP リクエストを送りたいとき、例えば、Web APIを叩きたい時、PHP では Guzzle という HTTP クライアントライブラリが最も有名である。

ドキュメントはこちら

https://docs.guzzlephp.org/en/stable/index.html

GitHub のリポジトリはこちら

github.com



リクエストオプションの指定の方法

Guzzle の公式ドキュメントで、 Request Options の章をると、例えば headers (リクエストヘッダの指定方法)の例はこう書いている。

<?php

// Set various headers on a request
$client->request('GET', '/get', [
    'headers' => [
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);

これでも問題ないのだが、例えば headers の部分を header とタイポしてしまい、動かない...(タイポしていてもエラーにならない)と悩むことがある。

Guzzle には RequestOptions というクラスがあるので、これを使って以下のように書くことをオススメする

<?php

use GuzzleHttp\RequestOptions;

$client->request('GET', '/get', [
    RequestOptions::HEADERS => [
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);

こうすると、タイポすることがなくなり、タイポしていてもエラーになるので、気づくことができる。

HEADERS以外にも、 FORM_PARAMS など、リクエストオプションで使えるものは定義されているので、試してみてほしい。



例外処理の方法

まず注意点として、Guzzle でリクエストしたとき、400番台のレスポンス、または、500番台のレスポンスが帰ってきた時や、そもそもリクエストに失敗した場合には、例外が投げられる。

戻り値のレスポンスのステータスコードをチェックしてのエラー処理はできないので注意が必要。



例外の構造

エラーが起こったときに投げられる例外については、以下のような構造をしている。これは、公式ドキュメントの Quickstart の中にある Exceptions の中にある図である。

. \RuntimeException
└── TransferException (implements GuzzleException)
    ├── ConnectException (implements NetworkExceptionInterface)
    └── RequestException
        ├── BadResponseException
        │   ├── ServerException
        │   └── ClientException
        └── TooManyRedirectsException

公式ドキュメントはこちら

https://docs.guzzlephp.org/en/stable/quickstart.html#exceptions



例外の意味

  • \RuntimeException
    • TransferException - APIリクエスト中になにか起こった場合の例外
      • BadResponseException - レスポンスは返ってきたが、4xx エラーまたは 5xx エラー
        • ServerException - 5xxエラー
        • ClientException - 4xxエラー
      • ConnectException - timeoutや、そもそも接続できなかった時のエラー
      • TooManyRedirectsException – リダイレクトループになっている場合のエラー

こうなっているので、適切にキャッチして、例外処理をするようにしたい。



GuzzleException

これらとは別に GuzzleException という interface がある。

GuzzleException が implements されているクラスは、先ほど出てきた TransferException と、 GuzzleHttp\Exception\InvalidArgumentException の2つだけなのだが、これによって、全ての Guzzle の Exception は GuzzleException が implements されている。

ただし、 GuzzleHttp\Exception\InvalidArgumentException の方は、Guzzle の使い方を間違えた時の例外なので、通常例外処理をしたい場合は、TransferException の方だけを考えれば良い。



まとめ

  • RequestOptions クラスを使った方がいい
  • 例外処理は TransferExecption 以下のクラスを必要に応じてキャッチする



以前にこんな記事も書いたので参考にしてみてください。

www.utakata.work