A partir de 2019, aqui está o que eu elaborei com as respostas acima e os documentos do Guzzle para lidar com a exceção, obter o corpo da resposta, o código de status, a mensagem e outros itens de resposta às vezes 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. Você obtém as informações da resposta em itens convenientemente separados.
Notas laterais:
Com a catch
cláusula, capturamos a classe de exceção raiz PHP da cadeia de herança à
\Exception
medida que as exceções personalizadas do Guzzle a estendem.
Essa abordagem pode ser útil para casos de uso em que o Guzzle é usado sob o capô, como no Laravel ou no AWS API PHP SDK, para que você não possa capturar a exceção genuína do Guzzle.
Nesse caso, a classe de exceção pode não ser a mencionada nos documentos do Guzzle (por exemplo, GuzzleHttp\Exception\RequestException
como exceção raiz do Guzzle).
Portanto, você precisa entender, \Exception
mas lembre-se de que ainda é a instância da classe de exceção Guzzle.
Embora use com cuidado. Esses invólucros podem tornar $e->getResponse()
os métodos genuínos do objeto Guzzle não disponíveis. Nesse caso, você terá que examinar o código fonte da exceção real do invólucro e descobrir como obter status, mensagem etc. em vez de usar $response
os métodos do Guzzle .
Se você telefonar diretamente para o Guzzle, poderá encontrar um GuzzleHttp\Exception\RequestException
ou qualquer outro mencionado nos documentos de exceção com relação às condições do seu caso de uso.