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?
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.
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.
J'utilise $response->getBody()->getContents()
pour obtenir JSON de la réponse. Guzzle version 6.3.0.
Si vous êtes toujours intéressés, voici ma solution de contournement basée sur Guzzle middleware feature:
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;
}
}
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
L'ajout de ->getContents()
ne renvoie pas de réponse jSON, il renvoie plutôt le texte.
Vous pouvez simplement utiliser json_decode