A partire dal 2019 ecco cosa ho elaborato dalle risposte sopra e dai documenti di Guzzle per gestire l'eccezione, ottenere il corpo della risposta, il codice di stato, il messaggio e gli altri elementi di risposta a volte preziosi.
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. ...
Ecco. Ottieni le informazioni sulla risposta in elementi opportunamente separati.
Note a margine:
Con la catch
clausola \Exception
catturiamo la classe di eccezione radice PHP della catena di ereditarietà
poiché le eccezioni personalizzate di Guzzle la estendono.
Questo approccio può essere utile per i casi d'uso in cui Guzzle viene utilizzato sotto il cofano come in Laravel o AWS API PHP SDK in modo da non poter catturare la vera eccezione Guzzle.
In questo caso, la classe dell'eccezione potrebbe non essere quella menzionata nella documentazione di Guzzle (ad esempio GuzzleHttp\Exception\RequestException
come eccezione principale per Guzzle).
Quindi devi prendere \Exception
invece, ma tieni presente che è ancora l'istanza della classe di eccezione Guzzle.
Anche se usa con cura. Questi wrapper potrebbero rendere $e->getResponse()
i metodi originali dell'oggetto Guzzle non disponibili. In questo caso, dovrai guardare il codice sorgente dell'eccezione effettiva del wrapper e scoprire come ottenere lo stato, il messaggio, ecc. Invece di usare $response
i metodi di Guzzle .
Se chiami Guzzle direttamente tu stesso puoi catturare GuzzleHttp\Exception\RequestException
o qualsiasi altro menzionato nei loro documenti di eccezioni rispetto alle condizioni del tuo caso d'uso.