Guzzlehttp – Как получить тело ответа от Guzzle 6?

Я пытаюсь написать обертку вокруг api, которую разрабатывает моя компания. Это успокаивает, и, используя Postman, я могу отправить запрос на отправку конечной точки, например http://subdomain.dev.myapi.com/api/v1/auth/ с именем пользователя и паролем в качестве данных POST, и мне возвращается токен. Все работает так, как ожидалось. Теперь, когда я пытаюсь сделать то же самое с 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) { } } } с 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) { } } } с 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) { } } } для 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 в запросе, поэтому я не уверен точно, что мне нужно сделать, чтобы получить возвращаемые данные.

Solutions Collecting From Web of "Guzzlehttp – Как получить тело ответа от Guzzle 6?"

Guzzle реализует PSR-7 . Это означает, что он по умолчанию будет хранить тело сообщения в потоке, который использует PHP temp streams. Чтобы получить все данные, вы можете использовать оператор литья:

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

Вы также можете сделать это с помощью

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

Разница между getContents двумя подходами заключается в том, что getContents возвращает оставшееся содержимое, так что второй вызов ничего не возвращает, если вы не ищете позицию потока с rewind или seek .

 $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