web-dev-qa-db-ja.com

Guzzlehttp - Guzzle 6からレスポンスの本文を取得する方法

私の会社が開発しているAPIの周りにラッパーを書いています。それは静かです、そしてPostmanを使用して私はPOST dataとしてユーザ名とパスワードでhttp://subdomain.dev.myapi.com/api/v1/auth/のようなポストリクエストをエンドポイントに送ることができ、私はトークンを返されます。すべて正常に動作します。さて、私がPHPから同じことをやろうとすると、私はGuzzleHttp\Psr7\Responseオブジェクトを取り戻しますが、Postman要求で行ったようにその中のどこにもトークンを見つけることができないようです。

関連コードは次のようになります。

$client = new Client(['base_uri' => 'http://companysub.dev.myapi.com/']);
$response = $client->post('api/v1/auth/', [
    'form_params' => [
        'username' => $user,
        'password' => $password
    ]
]);

var_dump($response); //or $resonse->getBody(), etc...

上記のコードの出力は、次のようになります(警告、テキストの着信)。

object(guzzlehttp\psr7\response)#36 (6) {
  ["reasonphrase":"guzzlehttp\psr7\response":private]=>
  string(2) "ok"
  ["statuscode":"guzzlehttp\psr7\response":private]=>
  int(200)
  ["headers":"guzzlehttp\psr7\response":private]=>
  array(9) {
    ["connection"]=>
    array(1) {
      [0]=>
      string(10) "keep-alive"
    }
    ["server"]=>
    array(1) {
      [0]=>
      string(15) "gunicorn/19.3.0"
    }
    ["date"]=>
    array(1) {
      [0]=>
      string(29) "sat, 30 may 2015 17:22:41 gmt"
    }
    ["transfer-encoding"]=>
    array(1) {
      [0]=>
      string(7) "chunked"
    }
    ["content-type"]=>
    array(1) {
      [0]=>
      string(16) "application/json"
    }
    ["allow"]=>
    array(1) {
      [0]=>
      string(13) "post, options"
    }
    ["x-frame-options"]=>
    array(1) {
      [0]=>
      string(10) "sameorigin"
    }
    ["vary"]=>
    array(1) {
      [0]=>
      string(12) "cookie, Host"
    }
    ["via"]=>
    array(1) {
      [0]=>
      string(9) "1.1 vegur"
    }
  }
  ["headerlines":"guzzlehttp\psr7\response":private]=>
  array(9) {
    ["connection"]=>
    array(1) {
      [0]=>
      string(10) "keep-alive"
    }
    ["server"]=>
    array(1) {
      [0]=>
      string(15) "gunicorn/19.3.0"
    }
    ["date"]=>
    array(1) {
      [0]=>
      string(29) "sat, 30 may 2015 17:22:41 gmt"
    }
    ["transfer-encoding"]=>
    array(1) {
      [0]=>
      string(7) "chunked"
    }
    ["content-type"]=>
    array(1) {
      [0]=>
      string(16) "application/json"
    }
    ["allow"]=>
    array(1) {
      [0]=>
      string(13) "post, options"
    }
    ["x-frame-options"]=>
    array(1) {
      [0]=>
      string(10) "sameorigin"
    }
    ["vary"]=>
    array(1) {
      [0]=>
      string(12) "cookie, Host"
    }
    ["via"]=>
    array(1) {
      [0]=>
      string(9) "1.1 vegur"
    }
  }
  ["protocol":"guzzlehttp\psr7\response":private]=>
  string(3) "1.1"
  ["stream":"guzzlehttp\psr7\response":private]=>
  object(guzzlehttp\psr7\stream)#27 (7) {
    ["stream":"guzzlehttp\psr7\stream":private]=>
    resource(40) of type (stream)
    ["size":"guzzlehttp\psr7\stream":private]=>
    null
    ["seekable":"guzzlehttp\psr7\stream":private]=>
    bool(true)
    ["readable":"guzzlehttp\psr7\stream":private]=>
    bool(true)
    ["writable":"guzzlehttp\psr7\stream":private]=>
    bool(true)
    ["uri":"guzzlehttp\psr7\stream":private]=>
    string(10) "php://temp"
    ["custommetadata":"guzzlehttp\psr7\stream":private]=>
    array(0) {
    }
  }
}

Postmanからの出力は次のようなものでした。

{
    "data" : {
        "token" "fasdfasf-asfasdfasdf-sfasfasf"
    }
}

Guzzleでレスポンスオブジェクトを操作することについて何か明らかに欠けています。 Guzzleレスポンスはリクエストに200ステータスコードを示しているので、返されたデータを取得するために必要なことが正確にはわかりません。

122
Greg

Guzzleは PSR-7 を実装しています。つまり、メッセージの本文はデフォルトでPHP tempストリームを使用する Stream に格納されます。すべてのデータを取得するには、キャスト演算子を使用できます。

$contents = (string) $response->getBody();

またそれをすることができます

$contents = $response->getBody()->getContents();

2つの方法の違いは、getContentsは残りの内容を返すため、rewindまたはseekでストリームの位置を検索しない限り、2番目の呼び出しでは何も返されないという点です。

$stream = $response->getBody();
$contents = $stream->getContents(); // returns all the contents
$contents = $stream->getContents(); // empty string
$stream->rewind(); // Seek to the beginning
$contents = $stream->getContents(); // returns all the contents

代わりに、PHPの文字列キャスト操作を使用して、最初から最後までストリームからすべてのデータを読み取ります。

$contents = (string) $response->getBody(); // returns all the contents
$contents = (string) $response->getBody(); // returns all the contents

ドキュメント: http://docs.guzzlephp.org/en/latest/psr7.html#responses

348
Federkun