Od 2019 r. Opracowałem na podstawie powyższych odpowiedzi i dokumentów Guzzle, aby obsłużyć wyjątek, uzyskać treść odpowiedzi, kod stanu, wiadomość i inne czasami cenne elementy odpowiedzi.
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. Otrzymujesz informacje o odpowiedzi w wygodnie oddzielonych pozycjach.
Uwagi dodatkowe:
Za pomocą catchklauzuli \Exceptionłapiemy klasę wyjątku głównego PHP łańcucha dziedziczenia,
ponieważ niestandardowe wyjątki Guzzle ją rozszerzają.
To podejście może być przydatne w przypadkach użycia, w których Guzzle jest używane pod maską, jak w Laravel lub AWS API PHP SDK, więc nie możesz złapać prawdziwego wyjątku Guzzle.
W tym przypadku klasa wyjątku może nie być tą, o której mowa w dokumentacji Guzzle (np. GuzzleHttp\Exception\RequestExceptionJako główny wyjątek dla Guzzle).
Więc \Exceptionzamiast tego musisz złapać, ale pamiętaj, że nadal jest to instancja klasy wyjątku Guzzle.
Chociaż używaj ostrożnie. Te opakowania mogą sprawić, $e->getResponse()że oryginalne metody obiektu Guzzle będą niedostępne. W takim przypadku będziesz musiał spojrzeć na rzeczywisty kod źródłowy wyjątku opakowania i dowiedzieć się, jak uzyskać status, komunikat itp. Zamiast używać $responsemetod Guzzle .
Jeśli zadzwonisz bezpośrednio do Guzzle, możesz złapać GuzzleHttp\Exception\RequestExceptionlub inny wymieniony w ich dokumentach wyjątków w odniesieniu do warunków twojego przypadku użycia.