web-dev-qa-db-ja.com

Guzzle 6:返事のためのjson()メソッドはもうありがとう

以前の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']);

それとも、そのようなものがありますか。

142
rap-2-h

私は今json_decode($response->getBody())の代わりに$response->json()を使います。

私はこれがPSR-7コンプライアンスの犠牲になるかもしれないと思います。

245
meriial

に切り替えます。

json_decode($response->getBody(), true)

オブジェクトではなく配列を取得するために、以前とまったく同じように機能させたい場合は、他のコメントではなく.

97
dmyers

レスポンスからJSONを取得するには$response->getBody()->getContents()を使います。 Guzzle version 6.3.0.

20
jusep

あなたがまだ興味を持っているのであれば、これがGuzzle ミドルウェア featureに基づく私の回避策です:

  1. そうでない場合は、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;
        }
    }
    
  2. --- ミドルウェア を作成して、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でテスト済み

4
andrew

->getContents()を追加してもjSONレスポンスは返されず、代わりにテキストとして返されます。

単にjson_decodeを使うことができます

1
Moh