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ą catch
klauzuli \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\RequestException
Jako główny wyjątek dla Guzzle).
Więc \Exception
zamiast 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ć $response
metod Guzzle .
Jeśli zadzwonisz bezpośrednio do Guzzle, możesz złapać GuzzleHttp\Exception\RequestException
lub inny wymieniony w ich dokumentach wyjątków w odniesieniu do warunków twojego przypadku użycia.