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 json()
mais método. 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?
$response->json()
auxiliar.->json()
funcionou, usojson_decode($response->getBody(), true)
, em vez de obter uma matriz em vez de um stdObjectstrict_types
, eu precisava moldar o corpo da resposta Guzzle antes de decodificá-lo:json_decode((string) $response->getBody(), true)
\GuzzleHttp\json_decode
(ou\GuzzleHttp\Utils::jsonDecode
dependendo da versão do Guzzle que você está) que tem uma assinatura compatível\json_decode
, mas gera uma exceção se houver um erro, alavancando o tratamento adequado dos erros.Você muda para:
Em vez do outro comentário, se você deseja que ele funcione exatamente como antes, para obter matrizes em vez de objetos.
fonte
Eu uso
$response->getBody()->getContents()
para obter JSON de resposta. Guzzle versão 6.3.0.fonte
getContents()
no corpo da resposta esvaziará o fluxo e a próxima chamada paragetContents()
retornará vazia. Se você quiser obter o corpo como o uso string:strval($response->getBody())
Se vocês ainda estão interessados, aqui está minha solução alternativa, com o recurso de middleware Guzzle :
Crie
JsonAwaraResponse
que decodifique a resposta JSON peloContent-Type
cabeçalho HTTP, se não - ele atuará como resposta padrão do Guzzle:Crie o Middleware que substituirá as respostas do Guzzle PSR-7 pela implementação de resposta acima:
Depois disso, para recuperar o JSON como matriz nativa do PHP, use o Guzzle como sempre:
Testado com guzzlehttp / guzzle 6.3.3
fonte
MessageInterface
. Com o PSR-7, não há solução legal para corrigir esta interface para retornar o JSON decodificado dogetBody()
método.$response
é uma instância do PSR-7ResponseInterface
. Para mais detalhes, consulte https://www.php-fig.org/psr/psr-7/#3-interfacesgetBody()
retornaStreamInterface
:StreamInterface
implementa o__toString()
que fazPortanto, para ler o corpo como string, você deve convertê-lo em string:
$stringBody = (string) $response->getBody()
Pegadinhas
json_decode($response->getBody()
não é a melhor solução, pois lança magicamente o fluxo em seqüência para você.json_decode()
requer string como 1º argumento.$response->getBody()->getContents()
menos que saiba o que está fazendo. Se você ler a documentação paragetContents()
, ele diz:Returns the remaining contents in a string
. Portanto, a chamadagetContents()
lê o restante do fluxo e a chamada novamente não retorna nada porque o fluxo já está no final. Você teria que rebobinar o fluxo entre essas chamadas.fonte
A adição
->getContents()
não retorna a resposta jSON, mas retorna como texto.Você pode simplesmente usar
json_decode
fonte