php - with - Guzzle 6: não há mais método json() para respostas




php guzzle async request (4)

Anteriormente no Guzzle 5.3:

$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);

Eu poderia facilmente obter uma matriz PHP a partir de uma resposta JSON. Agora, no Guzzle 6, não sei como fazer. Parece não haver mais método json() . Li (rapidamente) o documento da versão mais recente e não encontrei nada sobre as respostas JSON. Acho que perdi alguma coisa, talvez haja um novo conceito que não entendo (ou talvez não tenha lido corretamente).

Esta (abaixo) nova maneira é a única maneira?

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

Ou existe um ajudante ou algo assim?


Adicionar ->getContents() não retorna a resposta jSON, mas retorna como texto.

Você pode simplesmente usar json_decode


Eu uso $response->getBody()->getContents() para obter o JSON da resposta. Guzzle versão 6.3.0.


Se vocês ainda estão interessados, aqui está minha solução alternativa, com o recurso de middleware Guzzle:

  1. Crie JsonAwaraResponse que decodificará a resposta JSON pelo cabeçalho HTTP do Content-Type , caso contrário - ele atuará como resposta padrão do Guzzle:

    <?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. Crie o middleware que substituirá as respostas do Guzzle PSR-7 pela implementação de resposta acima:

    <?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');

Depois disso, para recuperar JSON como matriz nativa do PHP, use o Guzzle como sempre:

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

Testado com guzzlehttp / guzzle 6.3.3


Você muda para:

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

Em vez do outro comentário, se você deseja que ele funcione exatamente como antes, para obter matrizes em vez de objetos.





guzzle