web-dev-qa-db-ja.com

GuzzleがJSON本体ではなくストリームの空の本体を返す

Postmanを使用してAPI呼び出しを行うと、JSONオブジェクトを受け取ります。これは私が期待していたものです。 enter image description here

ただし、Guzzleで次のように同じ電話をかけると、

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.dev/']);

$response = $client->request('GET', 'search', [
    'verify' => false,
]);

var_dump($response->getBody()); //null

var_dump($response); //returns below

Guzzleからダンプを取得します

Response {#304 ▼
  -reasonPhrase: "OK"
  -statusCode: 200
  -headers: array:8 [▼
    "Server" => array:1 [▶]
    "Content-Type" => array:1 [▼
      0 => "application/json"
    ]
    "Transfer-Encoding" => array:1 [▶]
    "Connection" => array:1 [▶]
    "Cache-Control" => array:1 [▶]
    "Date" => array:1 [▶]
    "X-RateLimit-Limit" => array:1 [▶]
    "X-RateLimit-Remaining" => array:1 [▶]
  ]
  -headerNames: array:8 [▼
    "server" => "Server"
    "content-type" => "Content-Type"
    "transfer-encoding" => "Transfer-Encoding"
    "connection" => "Connection"
    "cache-control" => "Cache-Control"
    "date" => "Date"
    "x-ratelimit-limit" => "X-RateLimit-Limit"
    "x-ratelimit-remaining" => "X-RateLimit-Remaining"
  ]
  -protocol: "1.1"
  -stream: Stream {#302 ▼
    -stream: stream resource @15 ▼
      wrapper_type: "PHP"
      stream_type: "TEMP"
      mode: "w+b"
      unread_bytes: 0
      seekable: true
      uri: "php://temp"
      options: []
    }
    -size: null
    -seekable: true
    -readable: true
    -writable: true
    -uri: "php://temp"
    -customMetadata: []
  }
}
14
Emeka Mbah

getBody()はストリームを返します。すべてのコンテンツを一度に取得したい場合は、getContents()メソッドを使用して、その間にjsonをデコードできます(必要な場合)。

$payload = json_decode($response->getBody()->getContents());

さらに読む- Guzzle Responses

41
peterm

$ response-> getBody()-> getContents()が機能しない場合は、以下を試してください。

$response->getBody()->__toString();

前述のように here の場合、getContentsのストリームポインターが既にストリームの最後にあり、空の応答を返しますが、デフォルトでは__toStringがリセットします。

0
Milan Markovic