web-dev-qa-db-fra.com

Guzzle 6: pas de méthode json () pour les réponses

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 semble qu'il n'y ait plus de méthode json(). J'ai (rapidement) lu la documentation de la dernière version et je n'ai rien trouvé sur les réponses JSON. Je pense avoir manqué quelque chose, peut-être y a-t-il un nouveau concept que je ne comprends pas (ou peut-être que je n'ai pas lu correctement).

Est-ce que cette nouvelle voie (ci-dessous) est la seule?

$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['Origin']);

Ou y a-t-il un assistant ou quelque chose comme ça?

148
rap-2-h

J'utilise json_decode($response->getBody()) maintenant au lieu de $response->json().

Je soupçonne que cela pourrait être une victime de la conformité PSR-7.

252
meriial

Vous passez à:

json_decode($response->getBody(), true)

Au lieu de l'autre commentaire, si vous voulez qu'il fonctionne exactement comme avant, vous obtiendrez des tableaux plutôt que des objets.

101
dmyers

J'utilise $response->getBody()->getContents() pour obtenir JSON de la réponse. Guzzle version 6.3.0.

21
jusep

Si vous êtes toujours intéressés, voici ma solution de contournement basée sur Guzzle middleware feature:

  1. Créez JsonAwaraResponse qui décodera la réponse JSON par Content-Type en-tête HTTP, sinon - il agira comme une réponse Guzzle standard:

    <?php
    
    namespace GuzzleHttp\Psr7;
    
    
    class JsonAwareResponse extends Response
    {
        /**
         * Cache for performance
         * @var array
         */
        private $json;
    
        public function getBody()
        {
            if ($this->json) {
                return $this->json;
            }
            // get parent Body stream
            $body = parent::getBody();
    
            // if JSON HTTP header detected - then decode
            if (false !== strpos($this->getHeaderLine('Content-Type'), 'application/json')) {
                return $this->json = \json_decode($body, true);
            }
            return $body;
        }
    }
    
  2. Créez Middleware qui va remplacer les réponses Guzzle PSR-7 par l'implémentation de Response ci-dessus:

    <?php
    
    $client = new \GuzzleHttp\Client();
    
    /** @var HandlerStack $handler */
    $handler = $client->getConfig('handler');
    $handler->Push(\GuzzleHttp\Middleware::mapResponse(function (\Psr\Http\Message\ResponseInterface $response) {
        return new \GuzzleHttp\Psr7\JsonAwareResponse(
            $response->getStatusCode(),
            $response->getHeaders(),
            $response->getBody(),
            $response->getProtocolVersion(),
            $response->getReasonPhrase()
        );
    }), 'json_decode_middleware');
    

Après cela, pour récupérer le JSON en tant que PHP tableau natif, utilisez Guzzle comme toujours:

$jsonArray = $client->get('http://httpbin.org/headers')->getBody();

Testé avec guzzlehttp/guzzle 6.3.3

8
andrew

L'ajout de ->getContents() ne renvoie pas de réponse jSON, il renvoie plutôt le texte.

Vous pouvez simplement utiliser json_decode

1
Moh