Zuvor in Guzzle 5.3:
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);
Ich könnte leicht ein PHP-Array von einer JSON-Antwort erhalten. In Guzzle 6 weiß ich nicht, wie ich es machen soll. Es scheint keine json()
Methode mehr zu geben. Ich habe (schnell) das Dokument aus der neuesten Version gelesen und nichts über JSON-Antworten gefunden. Ich glaube, ich habe etwas verpasst, vielleicht gibt es ein neues Konzept, das ich nicht verstehe (oder vielleicht habe ich nicht richtig gelesen).
Ist dieser (unten) neue Weg der einzige Weg?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);
Oder gibt es einen Helfer oder so etwas?
$response->json()
Helfer auslaufen lassen .->json()
funktioniert, verwenden Siejson_decode($response->getBody(), true)
stattdessen, um ein Array anstelle eines stdObject zu erhaltenstrict_types
musste ich den Guzzle-Antwortkörper in einen String umwandeln, bevor ich ihn dekodierte:json_decode((string) $response->getBody(), true)
Sie wechseln zu:
Anstelle des anderen Kommentars, wenn Sie möchten, dass es genau wie zuvor funktioniert, um Arrays anstelle von Objekten zu erhalten.
quelle
Ich verwende
$response->getBody()->getContents()
, um JSON von der Antwort zu erhalten. Guzzle Version 6.3.0.quelle
getContents()
den Antworttext aufrufen,getContents()
wird der Stream geleert, und der nächste Aufruf von wird leer zurückgegeben. Wenn Sie den Körper als Zeichenfolge erhalten möchten, verwenden Sie:strval($response->getBody())
Wenn ihr noch interessiert seid, ist hier meine Problemumgehung basierend auf der Guzzle Middleware- Funktion:
Erstellen Sie
JsonAwaraResponse
dieseContent-Type
Option , um die JSON-Antwort per HTTP-Header zu dekodieren. Andernfalls wird sie als Standard-Guzzle-Antwort verwendet:Erstellen Sie eine Middleware, die die Guzzle PSR-7-Antworten durch die oben genannte Antwortimplementierung ersetzt:
Verwenden Sie danach Guzzle wie immer, um JSON als natives PHP-Array abzurufen:
Getestet mit guzzlehttp / guzzle 6.3.3
quelle
MessageInterface
. Mit PSR-7 gibt es keine legale Lösung, um diese Schnittstelle zu patchen und dekodierten JSON von dergetBody()
Methode zurückzugeben.$response
ist eine Instanz von PSR-7ResponseInterface
. Weitere Informationen finden Sie unter https://www.php-fig.org/psr/psr-7/#3-interfacesgetBody()
RückgabeStreamInterface
:StreamInterface
implementiert__toString()
was tutUm den Körper als Zeichenfolge zu lesen, müssen Sie ihn daher in eine Zeichenfolge umwandeln:
$stringBody = (string) $response->getBody()
Fallstricke
json_decode($response->getBody()
ist nicht die beste Lösung, da es den Stream auf magische Weise für Sie in einen String verwandelt.json_decode()
erfordert Zeichenfolge als 1. Argument.$response->getBody()->getContents()
Sie es nur, wenn Sie wissen, was Sie tun. Wenn Sie die Dokumentation für lesengetContents()
, heißt es :Returns the remaining contents in a string
. DahergetContents()
liest der Aufruf den Rest des Streams und der erneute Aufruf gibt nichts zurück, da der Stream bereits am Ende ist. Sie müssten den Stream zwischen diesen Anrufen zurückspulen.quelle
Beim Hinzufügen
->getContents()
wird keine jSON-Antwort zurückgegeben, sondern als Text.Sie können einfach verwenden
json_decode
quelle