de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 domos
domos
Question

Menangani membuang waktu pengecualian dan mendapatkan tubuh HTTP

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?

100 2013-11-02T23:29:52+00:00 4
Mark Amery
Mark Amery
Pertanyaan edit 20 Juni 2015 в 6:05
Pemrograman
php
guzzle
Mark Amery
Mark Amery
20 Juni 2015 в 6:20
2015-06-20T18:20:58+00:00
Lebih
Sumber
Sunting
#22698103

Membuang waktu 6.x

Per docs, kecuali jenis anda mungkin perlu untuk menangkap adalah:

  • GuzzleHttp\Terkecuali\ClientException untuk 400-tingkat kesalahan
  • GuzzleHttp\Terkecuali\ServerException untuk 500-tingkat kesalahan
  • GuzzleHttp\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();
}
200
0
Solution / Answer
 sebbo
sebbo
2 November 2013 в 11:52
2013-11-02T23:52:04+00:00
Lebih
Sumber
Sunting
#22698102

Membuang waktu 3.x

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.

Mark Amery
Mark Amery
Jawaban edit 20 Juni 2015 в 6:01
64
0
 chap
chap
17 November 2016 в 12:06
2016-11-17T00:06:01+00:00
Lebih
Sumber
Sunting
#22698104

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);
  }

}
45
0
Valentine Shi
Valentine Shi
30 Juni 2019 в 7:24
2019-06-30T07:24:51+00:00
Lebih
Sumber
Sunting
#22698105

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 { /**

  • Kami menggunakan membuang waktu untuk membuat sebuah HTTP request di suatu tempat di
  • berikut theMethodMayThrowException(). */ $hasil = theMethodMayThorwException(); } catch (\Exception $e) { /**
  • Di sini kita benar-benar menangkap contoh GuzzleHttp\Psr7\Respon
  • (temukan di ./vendor/guzzlehttp/psr7/src/Response.php) dengan semua
  • sendiri dan 'Pesan' sifat's metode. Lihat lebih banyak penjelasan di bawah ini.
  • Jadi anda dapat memiliki: kode status HTTP, pesan, header dan body.
  • Hanya memeriksa pengecualian objek memiliki respon sebelumnya. */ if ($e->hasResponse()) { $response = $e->getResponse(); var_dump($respon->getStatusCode()); // kode status HTTP var_dump($respon->getReasonPhrase()); // Pesan var_dump((string) $respon->getBody()); // Tubuh var_dump($respon->getHeaders()); // Header array var_dump($respon->hasHeader('Content-Type')); // header disajikan? var_dump($respon->getHeader('Content-Type')[0]); // Beton header value } } // proses $hasil dll. ... ``

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.

Valentine Shi
Valentine Shi
Jawaban edit 1 Oktober 2019 в 2:26
5
0
Related communities 5
Telegram Bot PHP - Indonesia
Telegram Bot PHP - Indonesia
11 192 pengguna
Pengen tau ada bot apa aja? Cek @botkoleksi Grup diskusi tentang pembuatan bot telegram menggunakan bahasa pemrograman PHP. Bahasa Lain, Tetap welcome. Diskusi bot lainnya @botIndonesia Ngobrol bebas di @indonesiabicara
Buka telegram
PHP Indonesia Community
PHP Indonesia Community
3 207 pengguna
Grup telegram yang membahas secara khusus seputar progamming php. Sarana untuk saling berkomunikasi, berbagi tips dan trik, tutorial, loker serta tanya jawab.
Buka telegram
Programmer PHP Indonesia
Programmer PHP Indonesia
912 pengguna
Buka telegram
PHP INDONESIA JOGLORAYA
PHP INDONESIA JOGLORAYA
635 pengguna
PHP INDONESIA Regional Jogja - Solo Raya @phpjogloraya
Buka telegram
PHP HTML Indonesia
PHP HTML Indonesia
59 pengguna
~ Menerima Jasa Pembuatan Website untuk : Tugas & Instansi 💻 ~ Forum Diskusi Belajar Bersama ✅ ~ Promosi Jasa Minimal 1x Sehari ✅ ~ Dilarang Berbicara Kotor 🚫 ^ Other Grup : Whatsapp Group : Chat Admin untuk masuk ke Grup Whatsapp ^^
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 2 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi