以前のGuzzle 5.3では、
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['Origin']);
JSONレスポンスからPHP配列を簡単に取得できます。さて、Guzzle 6では、どうすればいいのかわかりません。 json()
メソッドはもうないようです。私は(すぐに)最新版の文書を読みましたが、JSONの応答については何も見つかりませんでした。私は私が何かを逃したと思います、多分私は理解していないという新しい概念があるでしょう(あるいは私は正しく読まなかったかもしれません)。
これ(以下)の新しい方法は唯一の方法ですか?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['Origin']);
それとも、そのようなものがありますか。
私は今json_decode($response->getBody())
の代わりに$response->json()
を使います。
私はこれがPSR-7コンプライアンスの犠牲になるかもしれないと思います。
に切り替えます。
json_decode($response->getBody(), true)
オブジェクトではなく配列を取得するために、以前とまったく同じように機能させたい場合は、他のコメントではなく.
レスポンスからJSONを取得するには$response->getBody()->getContents()
を使います。 Guzzle version 6.3.0.
あなたがまだ興味を持っているのであれば、これがGuzzle ミドルウェア featureに基づく私の回避策です:
そうでない場合は、HTTPヘッダーContent-Type
でJSON応答をデコードするJsonAwaraResponse
を作成します。これは標準のGuzzle Responseとして機能します。
<?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;
}
}
--- ミドルウェア を作成して、Guzzle PSR-7レスポンスを上記のレスポンス実装に置き換えます。
<?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');
その後、JSONをPHPネイティブ配列として取得するには、いつものようにGuzzleを使用します。
$jsonArray = $client->get('http://httpbin.org/headers')->getBody();
guzzlehttp/guzzle 6.3.3でテスト済み
->getContents()
を追加してもjSONレスポンスは返されず、代わりにテキストとして返されます。
単にjson_decode
を使うことができます