wake-up-neo.com

Guzzlehttp - Wie erhält man den Körper einer Antwort von Guzzle 6?

Ich versuche, einen Wrapper um eine API zu schreiben, die meine Firma entwickelt. Es ist erholsam, und mit Postman kann ich eine Post-Anfrage an einen Endpunkt wie http://subdomain.dev.myapi.com/api/v1/auth/ Mit einem Benutzernamen und einem Passwort als POST Daten senden, und mir wird ein Token zurückgegeben. Alles funktioniert wie erwartet. Wenn ich nun versuche, das Gleiche mit PHP zu tun, erhalte ich ein GuzzleHttp\Psr7\Response - Objekt zurück, kann aber das Token an keiner Stelle darin finden, wie ich es bei der Postman-Anfrage getan habe.

Der relevante Code sieht wie folgt aus:

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

Die Ausgabe des obigen Codes sieht ungefähr so ​​aus (Warnung, eingehende Textwand):

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

Die Ausgabe von Postman war ungefähr so:

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

Klar, mir fehlt etwas über die Arbeit mit den Antwortobjekten in Guzzle. Die Guzzle-Antwort zeigt einen 200-Statuscode auf der Anfrage an, sodass ich nicht genau weiß, was ich tun muss, um die zurückgegebenen Daten abzurufen.

130
Greg

Düsenwerkzeuge PSR-7 . Das bedeutet, dass der Nachrichtentext standardmäßig in einem Stream gespeichert wird, der PHP temporäre Streams verwendet. Um alle Daten abzurufen, können Sie den Casting-Operator verwenden:

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

Sie können es auch mit tun

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

Der Unterschied zwischen den beiden Ansätzen besteht darin, dass getContents den verbleibenden Inhalt zurückgibt, sodass ein zweiter Aufruf nichts zurückgibt, es sei denn, Sie suchen die Position des Streams mit rewind oder 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

Verwendet man stattdessen die String-Casting-Operationen von PHP, werden alle Daten vom Anfang bis zum Ende des Streams gelesen.

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

Dokumentation: http://docs.guzzlephp.org/en/latest/psr7.html#responses

363
Federkun