Ab 2019 habe ich aus den obigen Antworten und den Guzzle-Dokumenten Folgendes herausgearbeitet , um die Ausnahme zu behandeln, den Antworttext, den Statuscode, die Nachricht und die anderen manchmal wertvollen Antwortelemente abzurufen.
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. Sie erhalten die Informationen der Antwort in bequem getrennten Elementen.
Randnotizen:
Mit catch
Klausel fangen wir die PHP-Root-Ausnahmeklasse der Vererbungskette
\Exception
ab, wenn benutzerdefinierte Guzzle-Ausnahmen sie erweitern.
Dieser Ansatz kann für Anwendungsfälle nützlich sein, in denen Guzzle wie in Laravel oder AWS API PHP SDK unter der Haube verwendet wird, sodass Sie die echte Guzzle-Ausnahme nicht abfangen können.
In diesem Fall ist die Ausnahmeklasse möglicherweise nicht die in den Guzzle-Dokumenten erwähnte (z GuzzleHttp\Exception\RequestException
als Root-Ausnahme für Guzzle).
Sie müssen also \Exception
stattdessen fangen, aber denken Sie daran, dass es sich immer noch um die Guzzle-Ausnahmeklasseninstanz handelt.
Obwohl mit Vorsicht verwenden. Diese Wrapper machen möglicherweise $e->getResponse()
die echten Methoden des Guzzle- Objekts nicht verfügbar. In diesem Fall müssen Sie sich den tatsächlichen Ausnahmequellcode des Wrappers ansehen und herausfinden, wie Sie Status, Nachricht usw. abrufen können $response
, anstatt die Methoden von Guzzle zu verwenden.
Wenn Sie Guzzle direkt selbst anrufen, können Sie GuzzleHttp\Exception\RequestException
oder andere in den Ausnahmedokumenten erwähnte Dokumente in Bezug auf Ihre Anwendungsfallbedingungen abfangen .