retrieve psr7 guzzlehttp debug php response guzzle guzzle6

php - psr7 - json guzzle



Guzzlehttp-¿Cómo obtener el cuerpo de una respuesta de Guzzle 6? (1)

Estoy tratando de escribir un contenedor alrededor de una API que mi empresa está desarrollando. Es tranquilo, y con Postman puedo enviar una solicitud de publicación a un punto final como http://subdomain.dev.myapi.com/api/v1/auth/ con un nombre de usuario y contraseña como datos POST y me devuelven un token. Todo funciona como se esperaba. Ahora, cuando trato de hacer lo mismo desde PHP, GuzzleHttp/Psr7/Response un objeto GuzzleHttp/Psr7/Response , pero parece que no puedo encontrar el token en ningún lado, como hice con la solicitud de Postman.

El código relevante se ve así:

$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...

El resultado del código anterior se parece a (advertencia, muro de texto entrante):

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

El resultado de Postman fue algo así como:

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

Claramente, me falta algo sobre trabajar con los objetos de respuesta en Guzzle. La respuesta de Guzzle indica un código de estado 200 en la solicitud, por lo que no estoy seguro de qué debo hacer exactamente para recuperar los datos devueltos.


Guzzle implementa PSR-7 . Eso significa que, de forma predeterminada, almacenará el cuerpo de un mensaje en una Stream que utiliza secuencias temporales de PHP. Para recuperar todos los datos, puede usar el operador de conversión:

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

También puedes hacerlo con

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

La diferencia entre los dos enfoques es que getContents devuelve el contenido restante, por lo que una segunda llamada no devuelve nada a menos que busque la posición de la secuencia con rewind o 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

En cambio, utilizando las operaciones de conversión de cadenas de PHP, leerá todos los datos de la secuencia desde el principio hasta el final.

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

Documentación: http://docs.guzzlephp.org/en/latest/psr7.html#responses