php - docs - guzzlehttp client example
Guzzle 6: no más método json() para respuestas (5)
Ahora uso
json_decode($response->getBody())
lugar de
$response->json()
.
Sospecho que esto podría ser una víctima del cumplimiento de PSR-7.
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 método
json()
.
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í?
Al agregar
->getContents()
no se devuelve la respuesta jSON, sino que se devuelve como texto.
Simplemente puede usar
json_decode
Cambias a:
json_decode($response->getBody(), true)
En lugar del otro comentario, si desea que funcione exactamente como antes para obtener matrices en lugar de objetos.
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 por el encabezado HTTPContent-Type
, si no, actuará como respuesta estándar de 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; } }
-
Cree middleware que reemplazará las respuestas de Guzzle PSR-7 con la implementación de Respuesta anterior:
<?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'');
Después de esto para recuperar JSON como matriz nativa de PHP, use Guzzle como siempre:
$jsonArray = $client->get(''http://httpbin.org/headers'')->getBody();
Probado con guzzlehttp / guzzle 6.3.3
Uso
$response->getBody()->getContents()
para obtener JSON de la respuesta.
Guzzle versión 6.3.0.