Mulai 2019, inilah yang saya uraikan dari jawaban di atas dan dokumen Guzzle untuk menangani pengecualian, mendapatkan isi respons, kode status, pesan, dan item respons terkadang berharga lainnya.
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. Anda mendapatkan informasi respons dalam item yang dipisahkan dengan mudah.
Catatan Samping:
Dengan catchklausa kita menangkap rantai warisan kelas pengecualian akar PHP
\Exceptionsebagai pengecualian khusus Guzzle memperluasnya.
Pendekatan ini mungkin berguna untuk kasus penggunaan di mana Guzzle digunakan secara tersembunyi seperti di Laravel atau AWS API PHP SDK sehingga Anda tidak dapat menangkap pengecualian Guzzle asli.
Dalam kasus ini, kelas pengecualian mungkin bukan yang disebutkan dalam dokumen Guzzle (misalnya GuzzleHttp\Exception\RequestExceptionsebagai pengecualian root untuk Guzzle).
Jadi, Anda harus menangkapnya, \Exceptiontetapi perlu diingat bahwa ini masih merupakan instance kelas pengecualian Guzzle.
Meskipun digunakan dengan hati-hati. Pembungkus tersebut mungkin membuat $e->getResponse()metode asli objek Guzzle tidak tersedia. Dalam kasus ini, Anda harus melihat kode sumber pengecualian aktual pembungkus dan mencari tahu bagaimana mendapatkan status, pesan, dll. Daripada menggunakan $responsemetode Guzzle .
Jika Anda memanggil Guzzle sendiri secara langsung, Anda dapat menangkap GuzzleHttp\Exception\RequestExceptionatau yang lain yang disebutkan dalam dokumen pengecualian mereka sehubungan dengan kondisi kasus penggunaan Anda.