Anteriormente en Guzzle 5.3:
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);
Podría obtener fácilmente una matriz PHP a partir de una respuesta JSON. Ahora en Guzzle 6, no sé cómo hacerlo. Parece que ya no hay json()
método. Leí (rápidamente) el documento de la última versión y no encontré nada sobre las respuestas JSON. Creo que me perdí algo, tal vez hay un nuevo concepto que no entiendo (o tal vez no lo leí correctamente).
¿Es esta (abajo) nueva forma la única forma?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);
¿O hay un ayudante o algo así?
$response->json()
ayudante.->json()
, usejson_decode($response->getBody(), true)
en su lugar para obtener una matriz en lugar de un objeto estándarstrict_types
, necesitaba lanzar el cuerpo de respuesta de Guzzle a la cadena antes de decodificarlo:json_decode((string) $response->getBody(), true)
\GuzzleHttp\json_decode
(o\GuzzleHttp\Utils::jsonDecode
dependiendo de la versión de Guzzle en la que estés) que tiene una firma compatible\json_decode
, pero arroja una excepción si hay un error, aprovechando el manejo de errores adecuado.Cambias a:
En lugar del otro comentario, si desea que funcione exactamente como antes para obtener matrices en lugar de objetos.
fuente
Yo uso
$response->getBody()->getContents()
para obtener JSON de la respuesta. Guzzle versión 6.3.0.fuente
getContents()
al cuerpo de respuesta vaciará la secuencia y la próxima llamada agetContents()
volverá vacía. Si desea obtener el cuerpo como cadena:strval($response->getBody())
Si todavía están interesados, aquí está mi solución basada en la función de middleware Guzzle :
Cree
JsonAwaraResponse
que decodificará la respuesta JSON porContent-Type
encabezado HTTP, si no, actuará como respuesta estándar de Guzzle:Cree Middleware que reemplazará las respuestas de Guzzle PSR-7 con la implementación de Respuesta anterior:
Después de esto para recuperar JSON como matriz nativa de PHP, use Guzzle como siempre:
Probado con guzzlehttp / guzzle 6.3.3
fuente
MessageInterface
. Con PSR-7 no hay una solución legal para parchear esta interfaz para devolver JSON decodificado delgetBody()
método.$response
es una instancia de PSR-7ResponseInterface
. Para más detalles ver https://www.php-fig.org/psr/psr-7/#3-interfacesgetBody()
devuelveStreamInterface
:StreamInterface
implementa lo__toString()
que hacePor lo tanto, para leer el cuerpo como una cadena, debe convertirlo en una cadena:
$stringBody = (string) $response->getBody()
Gotchas
json_decode($response->getBody()
no es la mejor solución, ya que mágicamente emite secuencia en cadena para ti.json_decode()
requiere cadena como primer argumento.$response->getBody()->getContents()
menos que sepa lo que está haciendo. Si usted lee la documentacióngetContents()
, que dice:Returns the remaining contents in a string
. Por lo tanto, llamargetContents()
lee el resto de la secuencia y volver a llamar no devuelve nada porque la secuencia ya está al final. Tendría que rebobinar la secuencia entre esas llamadas.fuente
Agregar
->getContents()
no devuelve la respuesta jSON, sino que se devuelve como texto.Simplemente puedes usar
json_decode
fuente