Guzzlehttp – 如何从Guzzle 6获得响应的身体?

我正在尝试围绕我的公司正在开发的api编写封装。 这是安静的,使用邮递员我可以发送一个post请求到像http://subdomain.dev.myapi.com/api/v1/auth/一样的用户名和密码作为POST数据,我给回了一个令牌。 所有按预期工作。 现在,当我尝试从PHP执行相同的操作时,我得到一个GuzzleHttp\Psr7\Response对象,但似乎无法像在Postman请求中那样在其内部的任何位置find该令牌。

相关的代码如下所示:

 $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) { } } } 

邮差的输出是这样的:

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

很明显,我错过了一些关于在Guzzle中使用响应对象的东西。 Guzzle响应表示请求中有200个状态码,所以我不确定我需要做什么来检索返回的数据。

Gu implements执行PSR-7 。 这意味着它将默认将消息正文存储在使用PHP临时stream的Stream中。 要检索所有的数据,你可以使用铸造操作符:

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

你也可以这样做

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

这两种方法之间的区别在于getContents返回剩余的内容,所以第二个调用不会返回任何东西,除非您通过rewindseekstream的位置。

 $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的string转换操作,它将从头开始读取数据stream中的所有数据,直到达到结尾。

 $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