Sebelumnya di Guzzle 5.3:
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);
Saya bisa dengan mudah mendapatkan array PHP dari respons JSON. Sekarang dalam Guzzle 6, saya tidak tahu bagaimana melakukannya. Sepertinya tidak ada json()
metode lagi. Saya (cepat) membaca dokumen dari versi terbaru dan tidak menemukan apa pun tentang respons JSON. Saya rasa saya melewatkan sesuatu, mungkin ada konsep baru yang tidak saya mengerti (atau mungkin saya tidak membaca dengan benar).
Apakah ini (di bawah) cara baru satu-satunya cara?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);
Atau ada penolong atau semacamnya?
$response->json()
helper.->json()
, gunakanjson_decode($response->getBody(), true)
sebagai gantinya untuk mendapatkan larik alih-alih stdObjectstrict_types
, saya harus melemparkan tubuh respons Guzzle ke string sebelum mendekodekannya:json_decode((string) $response->getBody(), true)
\GuzzleHttp\json_decode
(atau\GuzzleHttp\Utils::jsonDecode
tergantung pada versi Guzzle yang Anda gunakan ) yang memiliki tanda tangan yang kompatibel\json_decode
, tetapi melemparkan pengecualian jika ada kesalahan, meningkatkan penanganan kesalahan yang tepat.Anda beralih ke:
Alih-alih komentar lain jika Anda ingin bekerja persis seperti sebelumnya untuk mendapatkan array, bukan objek.
sumber
Saya menggunakan
$response->getBody()->getContents()
untuk mendapatkan JSON dari respons. Buang versi 6.3.0.sumber
getContents()
di badan respons akan mengosongkan aliran dan panggilan berikutnyagetContents()
akan kembali kosong. Jika Anda ingin mendapatkan tubuh sebagai string gunakan:strval($response->getBody())
Jika kalian masih tertarik, ini solusi saya berdasarkan fitur middleware Guzzle :
Buat
JsonAwaraResponse
yang akan mendekode respons JSON denganContent-Type
tajuk HTTP, jika tidak - itu akan bertindak sebagai Respons Gerobak standar:Buat Middleware yang akan menggantikan respons Guzzle PSR-7 dengan implementasi Respons di atas:
Setelah ini untuk mengambil JSON sebagai array asli PHP, gunakan Guzzle seperti biasa:
Diuji dengan guzzlehttp / guzzle 6.3.3
sumber
MessageInterface
. Dengan PSR-7 tidak ada solusi hukum untuk menambal antarmuka ini untuk mengembalikan JSON yang didekodekan darigetBody()
metode.$response
adalah turunan dari PSR-7ResponseInterface
. Untuk perincian lebih lanjut, lihat https://www.php-fig.org/psr/psr-7/#3-interfacesgetBody()
pengembalianStreamInterface
:StreamInterface
mengimplementasikan__toString()
yang tidakKarenanya, untuk membaca body sebagai string, Anda harus mengubahnya menjadi string:
$stringBody = (string) $response->getBody()
Gotcha
json_decode($response->getBody()
bukan solusi terbaik karena secara ajaib memasukkan aliran ke string untuk Anda.json_decode()
membutuhkan string sebagai argumen pertama.$response->getBody()->getContents()
kecuali Anda tahu apa yang Anda lakukan. Jika Anda membaca dokumentasi untukgetContents()
, ia mengatakan:Returns the remaining contents in a string
. Oleh karena itu, panggilangetContents()
membaca sisa aliran dan memanggilnya kembali tidak menghasilkan apa-apa karena aliran sudah di akhir. Anda harus memutar ulang aliran di antara panggilan-panggilan itu.sumber
Menambahkan
->getContents()
tidak mengembalikan respons JSON, melainkan mengembalikan sebagai teks.Anda cukup menggunakan
json_decode
sumber