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 catch
klausa kita menangkap rantai warisan kelas pengecualian akar PHP
\Exception
sebagai 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\RequestException
sebagai pengecualian root untuk Guzzle).
Jadi, Anda harus menangkapnya, \Exception
tetapi 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 $response
metode Guzzle .
Jika Anda memanggil Guzzle sendiri secara langsung, Anda dapat menangkap GuzzleHttp\Exception\RequestException
atau yang lain yang disebutkan dalam dokumen pengecualian mereka sehubungan dengan kondisi kasus penggunaan Anda.