Guzzle とは
HTTP リクエストを送りたいとき、例えば、Web APIを叩きたい時、PHP では Guzzle という HTTP クライアントライブラリが最も有名である。
ドキュメントはこちら
https://docs.guzzlephp.org/en/stable/index.html
GitHub のリポジトリはこちら
リクエストオプションの指定の方法
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 – リダイレクトループになっている場合のエラー
- BadResponseException - レスポンスは返ってきたが、4xx エラーまたは 5xx エラー
- TransferException - APIリクエスト中になにか起こった場合の例外
こうなっているので、適切にキャッチして、例外処理をするようにしたい。
GuzzleException
これらとは別に GuzzleException
という interface がある。
GuzzleException が implements されているクラスは、先ほど出てきた TransferException
と、 GuzzleHttp\Exception\InvalidArgumentException
の2つだけなのだが、これによって、全ての Guzzle の Exception は GuzzleException が implements されている。
ただし、 GuzzleHttp\Exception\InvalidArgumentException
の方は、Guzzle の使い方を間違えた時の例外なので、通常例外処理をしたい場合は、TransferException の方だけを考えれば良い。
まとめ
- RequestOptions クラスを使った方がいい
- 例外処理は TransferExecption 以下のクラスを必要に応じてキャッチする
以前にこんな記事も書いたので参考にしてみてください。