Станом на 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пункту ми \Exceptionвловлюємо клас виключення кореневого класу PHP root
наслідок, оскільки користувацькі винятки Guzzle розширюють його.
Цей підхід може бути корисним для випадків, коли Guzzle використовується під кришкою, як у Laravel або AWS API PHP SDK, тому ви не можете зловити справжнє виключення Guzzle.
У цьому випадку класом виключень може бути не той, який згадується в документах Guzzle (наприклад, GuzzleHttp\Exception\RequestExceptionяк кореневий виняток для Guzzle).
Тож вам доведеться ловити \Exceptionзамість цього, але майте на увазі, що це все-таки екземпляр класу виключень Guzzle.
Хоча використовуйте обережно. Ці обгортки можуть зробити $e->getResponse()справжні методи об'єкта Guzzle недоступними. У цьому випадку вам доведеться переглянути фактичний вихідний код обгортки та дізнатися, як отримати статус, повідомлення тощо, а не використовувати методи Guzzle $response.
Якщо ви телефонуєте безпосередньо в Guzzle, ви можете спіймати GuzzleHttp\Exception\RequestExceptionбудь-який інший, зазначений у документах про їх винятки, щодо умов вашого використання.