Próbuję napisać otokę wokół interfejsu API, który rozwija moja firma. To spokojne, a za pomocą Postmana mogę wysłać żądanie postu do punktu końcowego, na przykład http://subdomain.dev.myapi.com/api/v1/auth/
z nazwą użytkownika i hasłem jako danymi POST i otrzymuję token. Wszystko działa zgodnie z oczekiwaniami. Teraz, kiedy próbuję zrobić to samo z PHP, otrzymuję GuzzleHttp\Psr7\Response
obiekt, ale nie mogę znaleźć tokena w dowolnym miejscu, tak jak to zrobiłem z żądaniem Listonosza.
Odpowiedni kod wygląda następująco:
$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...
Wynik powyższego kodu wygląda mniej więcej tak (ostrzeżenie, nadchodząca ściana tekstu):
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) {
}
}
}
Wynik Postmana wyglądał mniej więcej tak:
{
"data" : {
"token" "fasdfasf-asfasdfasdf-sfasfasf"
}
}
Najwyraźniej brakuje mi czegoś w pracy z obiektami odpowiedzi w Guzzle. Odpowiedź Guzzle wskazuje kod statusu 200 w żądaniu, więc nie jestem pewien, co dokładnie muszę zrobić, aby odzyskać zwrócone dane.
$response->getBody()->getContents()
nie działa?Odpowiedzi:
Guzzle implementuje PSR-7 . Oznacza to, że domyślnie przechowuje treść wiadomości w strumieniu, który używa strumieni tymczasowych PHP. Aby pobrać wszystkie dane, możesz użyć operatora rzutowania:
Możesz to również zrobić za pomocą
Różnica między tymi dwoma podejściami polega na tym, że
getContents
zwraca pozostałą zawartość, tak że drugie wywołanie nic nie zwraca, chyba że szukasz pozycji strumienia za pomocąrewind
lubseek
.Zamiast tego, korzystając z operacji rzutowania napisów PHP, odczyta wszystkie dane ze strumienia od początku do końca.
Dokumentacja: http://docs.guzzlephp.org/en/latest/psr7.html#responses
źródło
"you can pass true to this method [getBody()] to retrieve the body as a string."
. Wydaje się, że to nie działa dla mnie przy użyciu Guzzle 6, ale rzutowanie na string lub użycie getContents () działa.json_decode($response, true);
to zwróci tablicę.Jeśli spodziewasz się powrotu JSON, najprostszy sposób na jego odzyskanie:
json_decode()
automatycznie zarzuci ciało nastring
, więc nie ma potrzeby dzwonićgetContents()
.źródło