Я пытаюсь написать обертку вокруг 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 в запросе, поэтому я не уверен точно, что мне нужно сделать, чтобы получить возвращаемые данные.
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