A partir de 2019, esto es lo que elaboré a partir de las respuestas anteriores y los documentos de Guzzle para manejar la excepción, obtener el cuerpo de respuesta, el código de estado, el mensaje y los otros elementos de respuesta a veces valiosos.
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. ...
Voila Obtiene la información de la respuesta en elementos convenientemente separados.
Notas al margen:
Con la catchcláusula, captamos la clase de excepción de raíz PHP de la cadena de herencia a
\Exceptionmedida que las excepciones personalizadas de Guzzle la extienden.
Este enfoque puede ser útil para casos de uso en los que Guzzle se usa debajo del capó, como en Laravel o AWS API PHP SDK, por lo que no puede detectar la excepción genuina de Guzzle.
En este caso, la clase de excepción puede no ser la mencionada en los documentos de Guzzle (por ejemplo, GuzzleHttp\Exception\RequestExceptioncomo la excepción raíz para Guzzle).
Por lo tanto, debe atrapar, \Exceptionpero tenga en cuenta que todavía es la instancia de la clase de excepción Guzzle.
Aunque usar con cuidado. Esas envolturas pueden hacer Guzzle$e->getResponse() que los métodos genuinos del objeto no estén disponibles. En este caso, tendrá que mirar el código fuente de excepción real del contenedor y descubrir cómo obtener el estado, el mensaje, etc. en lugar de utilizar $responselos métodos de Guzzle .
Si llama a Guzzle directamente usted mismo, puede atrapar GuzzleHttp\Exception\RequestExceptiono cualquier otro mencionado en sus documentos de excepciones con respecto a las condiciones de su caso de uso.