Станом на 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
будь-який інший, зазначений у документах про їх винятки, щодо умов вашого використання.