À partir de 2019, voici ce que j'ai élaboré à partir des réponses ci-dessus et de la documentation Guzzle pour gérer l'exception, obtenir le corps de la réponse, le code d'état, le message et les autres éléments de réponse parfois précieux.
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. Vous obtenez les informations de la réponse dans des éléments séparés de manière pratique.
Notes secondaires:
Avec la catch
clause, nous capturons la classe d'exception racine PHP de la chaîne d'héritage
\Exception
car les exceptions personnalisées Guzzle l'étendent.
Cette approche peut être utile pour les cas d'utilisation où Guzzle est utilisé sous le capot, comme dans Laravel ou AWS API PHP SDK, de sorte que vous ne pouvez pas intercepter la véritable exception Guzzle.
Dans ce cas, la classe d'exception peut ne pas être celle mentionnée dans la documentation Guzzle (par exemple en GuzzleHttp\Exception\RequestException
tant qu'exception racine pour Guzzle).
Vous devez donc attraper à la \Exception
place, mais gardez à l'esprit qu'il s'agit toujours de l'instance de classe d'exception Guzzle.
Bien utiliser avec précaution. Ces wrappers peuvent rendre $e->getResponse()
les méthodes authentiques des objets Guzzle non disponibles. Dans ce cas, vous devrez regarder le code source des exceptions du wrapper et découvrir comment obtenir le statut, le message, etc. au lieu d'utiliser $response
les méthodes de Guzzle .
Si vous appelez Guzzle directement vous-même, vous pouvez attraper GuzzleHttp\Exception\RequestException
ou tout autre élément mentionné dans leurs documents d'exceptions en ce qui concerne les conditions de votre cas d'utilisation.