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 catch
cláusula, captamos la clase de excepción de raíz PHP de la cadena de herencia a
\Exception
medida 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\RequestException
como la excepción raíz para Guzzle).
Por lo tanto, debe atrapar, \Exception
pero 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 $response
los métodos de Guzzle .
Si llama a Guzzle directamente usted mismo, puede atrapar GuzzleHttp\Exception\RequestException
o cualquier otro mencionado en sus documentos de excepciones con respecto a las condiciones de su caso de uso.