Saya ingin menangani kesalahan dari membuang waktu ketika server kembali 4xx dan 5xx kode status. Saya membuat permintaan seperti ini:
$client = $this->getGuzzleClient();
$request = $client->post($url, $headers, $value);
try {
$response = $request->send();
return $response->getBody();
} catch (\Exception $e) {
// How can I get the response body?
}
$e->getMessage
kembali kode info tapi bukan tubuh dari respon HTTP. Bagaimana saya bisa mendapatkan respon tubuh?
Per docs, kecuali jenis anda mungkin perlu untuk menangkap adalah:
GuzzleHttp\Terkecuali\ClientException
untuk 400-tingkat kesalahanGuzzleHttp\Terkecuali\ServerException
untuk 500-tingkat kesalahanGuzzleHttp\Terkecuali\BadResponseException
untuk investasi (it's mereka superclass)Kode untuk menangani kesalahan tersebut sehingga sekarang terlihat seperti ini:
$client = new GuzzleHttp\Client;
try {
$client->get('http://google.com/nosuchpage');
}
catch (GuzzleHttp\Exception\ClientException $e) {
$response = $e->getResponse();
$responseBodyAsString = $response->getBody()->getContents();
}
Per docs, anda dapat menangkap sesuai jenis pengecualian (ClientErrorResponseException
untuk kesalahan 4xx) dan memanggil getResponse()
metode untuk mendapatkan respon objek, kemudian memanggil getBody()
pada bahwa:
use Guzzle\Http\Exception\ClientErrorResponseException;
...
try {
$response = $request->send();
} catch (ClientErrorResponseException $exception) {
$responseBody = $exception->getResponse()->getBody(true);
}
Lewat benar
untuk getBody
fungsi menunjukkan bahwa anda ingin mendapatkan respon tubuh sebagai string. Jika tidak, anda akan mendapatkan sebagai instance dari kelas membuang waktu\Http\EntityBody
.
Sedangkan jawaban di atas adalah baik, mereka tidak akan berurusan dengan kesalahan jaringan, Sebagai Tanda yang disebutkan BadResponseException hanya kelas super untuk ClientException dan ServerException. Tapi RequestException juga super kelas BadRequestException. Ini akan menangkap tidak hanya 400 dan 500 kesalahan tapi kesalahan jaringan juga. Jadi let's mengatakan anda meminta halaman di bawah ini, tetapi jaringan anda bermain dan anda menangkap mengharapkan BadResponseException. Nah aplikasi anda akan melempar kesalahan.
It's lebih baik dalam hal ini untuk mengharapkan RequestException dan memeriksa respon.
try {
$client->get('http://123123123.com')
} catch (RequestException $e) {
// If there are network errors, we need to ensure the application doesn't crash.
// if $e->hasResponse is not null we can attempt to get the message
// Otherwise, we'll just pass a network unavailable message.
if ($e->hasResponse()) {
$exception = (string) $e->getResponse()->getBody();
$exception = json_decode($exception);
return new JsonResponse($exception, $e->getCode());
} else {
return new JsonResponse($e->getMessage(), 503);
}
}
Sebagai 2019 berikut adalah apa yang saya tekuni dari jawaban-jawaban di atas dan membuang waktu docs untuk menangani pengecualian, mendapatkan respon tubuh, kode status, pesan, dan lain kadang-kadang berharga respon item.
`` php try { /**
Voila. Anda mendapatkan respon's informasi bagi dipisahkan barang-barang.
Side Catatan:
Dengan menangkap
klausul kita menangkap rantai warisan PHP akar kelas pengecualian
\Pengecualian
sebagai membuang waktu kustom pengecualian memperpanjang.
Pendekatan ini mungkin berguna untuk menggunakan kasus-kasus di mana membuang waktu ini digunakan di bawah tenda seperti di Laravel atau AWS API PHP SDK sehingga anda tidak dapat menangkap asli membuang waktu pengecualian.
Dalam hal ini, terkecuali kelas mungkin tidak menjadi salah satu yang disebutkan dalam membuang waktu docs (misalnya GuzzleHttp\Terkecuali\RequestException
sebagai akar pengecualian untuk membuang waktu).
Jadi, anda harus menangkap \Pengecualian
bukan tapi ingat ini masih membuang waktu pengecualian kelas misalnya.
Meskipun digunakan dengan hati-hati. Orang-orang pembungkus dapat membuat membuang waktu $e->getResponse()
objek's asli metode tidak tersedia. Dalam hal ini, anda akan memiliki untuk melihat pembungkus's sebenarnya kecuali source code anda dan menemukan cara untuk mendapatkan status, pesan, dll. alih-alih menggunakan membuang waktu $respon
's metode.
Jika anda menelepon membuang waktu langsung diri anda dapat menangkap GuzzleHttp\Terkecuali\RequestException
atau lainnya yang disebutkan dalam mereka pengecualian docs dengan hormat untuk anda menggunakan kasus kondisi.