Précédemment dans Guzzle 5.3:
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);
Je pourrais facilement obtenir un tableau PHP à partir d'une réponse JSON. Maintenant, dans Guzzle 6, je ne sais pas comment faire. Il ne semble plus y avoir de json()
méthode. J'ai (rapidement) lu le doc de la dernière version et je n'ai rien trouvé sur les réponses JSON. Je pense que j'ai raté quelque chose, peut-être qu'il y a un nouveau concept que je ne comprends pas (ou peut-être que je n'ai pas lu correctement).
Est-ce (ci-dessous) nouveau moyen le seul moyen?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);
Ou y a-t-il une aide ou quelque chose comme ça?
$response->json()
aide.->json()
, utilisezjson_decode($response->getBody(), true)
plutôt pour obtenir un tableau au lieu d'un stdObjectstrict_types
, j'avais besoin de lancer le corps de la réponse Guzzle en chaîne avant de le décoder:json_decode((string) $response->getBody(), true)
\GuzzleHttp\json_decode
(ou\GuzzleHttp\Utils::jsonDecode
selon la version de Guzzle sur laquelle vous êtes) qui a une signature compatible\json_decode
, mais lève une exception en cas d'erreur, en tirant parti d'une gestion correcte des erreurs.Vous passez à:
Au lieu de l'autre commentaire si vous voulez qu'il fonctionne exactement comme avant afin d'obtenir des tableaux au lieu d'objets.
la source
J'utilise
$response->getBody()->getContents()
pour obtenir JSON à partir de la réponse. Guzzle version 6.3.0.la source
getContents()
dans le corps de la réponse videra le flux et le prochain appel àgetContents()
retournera vide. Si vous voulez obtenir le corps sous forme de chaîne, utilisez:strval($response->getBody())
Si vous êtes toujours intéressé, voici ma solution de contournement basée sur la fonctionnalité middleware Guzzle :
Créez
JsonAwaraResponse
qui décodera la réponse JSON parContent-Type
en-tête HTTP, sinon - cela agira comme une réponse Guzzle standard:Créez un middleware qui va remplacer les réponses Guzzle PSR-7 par l'implémentation de réponse ci-dessus:
Après cela, pour récupérer JSON en tant que tableau natif PHP, utilisez Guzzle comme toujours:
Testé avec guzzlehttp / guzzle 6.3.3
la source
MessageInterface
. Avec PSR-7, il n'y a pas de solution légale pour patcher cette interface pour renvoyer le JSON décodé à partir de lagetBody()
méthode.$response
est une instance de PSR-7ResponseInterface
. Pour plus de détails, voir https://www.php-fig.org/psr/psr-7/#3-interfacesgetBody()
renvoieStreamInterface
:StreamInterface
met en œuvre__toString()
ce qui faitPar conséquent, pour lire le corps sous forme de chaîne, vous devez le convertir en chaîne:
$stringBody = (string) $response->getBody()
Gotchas
json_decode($response->getBody()
n'est pas la meilleure solution car il transforme comme par magie le flux en chaîne pour vous.json_decode()
nécessite une chaîne comme 1er argument.$response->getBody()->getContents()
que si vous savez ce que vous faites. Si vous lisez la documentation pourgetContents()
, il est dit:Returns the remaining contents in a string
. Par conséquent, l'appelgetContents()
lit le reste du flux et l'appel à nouveau ne retourne rien car le flux est déjà à la fin. Vous devrez rembobiner le flux entre ces appels.la source
L'ajout
->getContents()
ne renvoie pas de réponse jSON, mais plutôt sous forme de texte.Vous pouvez simplement utiliser
json_decode
la source