2019年現在、上記の回答とGuzzleのドキュメントから、例外を処理し、応答の本文、ステータスコード、メッセージ、およびその他の場合によっては貴重な応答項目を取得するために私が詳しく説明したものです。
try {
/**
* We use Guzzle to make an HTTP request somewhere in the
* following theMethodMayThrowException().
*/
$result = theMethodMayThrowException();
} catch (\GuzzleHttp\Exception\RequestException $e) {
/**
* Here we actually catch the instance of GuzzleHttp\Psr7\Response
* (find it in ./vendor/guzzlehttp/psr7/src/Response.php) with all
* its own and its 'Message' trait's methods. See more explanations below.
*
* So you can have: HTTP status code, message, headers and body.
* Just check the exception object has the response before.
*/
if ($e->hasResponse()) {
$response = $e->getResponse();
var_dump($response->getStatusCode()); // HTTP status code;
var_dump($response->getReasonPhrase()); // Response message;
var_dump((string) $response->getBody()); // Body, normally it is JSON;
var_dump(json_decode((string) $response->getBody())); // Body as the decoded JSON;
var_dump($response->getHeaders()); // Headers array;
var_dump($response->hasHeader('Content-Type')); // Is the header presented?
var_dump($response->getHeader('Content-Type')[0]); // Concrete header value;
}
}
// process $result etc. ...
出来上がり。応答の情報は、便利なように分割されたアイテムで取得されます。
サイドノート:
でcatch
句、私たちは、継承チェーンPHPのルート例外クラスをキャッチ
\Exception
がつがつ食うカスタム例外は、それを拡張して。
このアプローチは、LaravelやAWS API PHP SDKのように内部でGuzzleを使用するユースケースに役立つため、本物のGuzzle例外をキャッチできません。
この場合、例外クラスはGuzzleドキュメントで言及されているものではない可能性があります(例: GuzzleHttp\Exception\RequestException
のルート例外としてなど)。
したがって、\Exception
代わりにキャッチする必要がありますが、それでもGuzzle例外クラスインスタンスであることに注意してください。
注意して使用してください。これらのラッパーは、Guzzle $e->getResponse()
オブジェクトの本物のメソッドを使用できないようにする可能性があります。この場合、Guzzle $response
のメソッドを使用する代わりに、ラッパーの実際の例外ソースコードを調べて、ステータスやメッセージなどを取得する方法を見つける必要があります。
自分で直接Guzzleを呼び出す場合、キャッチするGuzzleHttp\Exception\RequestException
か、ユースケースの条件に関して例外ドキュメントで言及されている他のいずれかを呼び出すことができます。