Guzzlehttp – Wie bekomme ich den Text einer Antwort von Guzzle 6?

Lesezeit: 5 Minuten

Guzzlehttp Wie bekomme ich den Text einer Antwort von
Greg

Ich versuche, einen Wrapper um eine API zu schreiben, die mein Unternehmen entwickelt. Es ist beruhigend und mit Postman kann ich eine Post-Anforderung an einen Endpunkt wie senden http://subdomain.dev.myapi.com/api/v1/auth/ mit einem Benutzernamen und Passwort als POST-Daten und ich bekomme ein Token zurück. Alles funktioniert wie erwartet. Wenn ich jetzt versuche, dasselbe von PHP aus zu tun, erhalte ich a zurück GuzzleHttp\Psr7\Response Objekt, aber ich kann das Token anscheinend nirgendwo darin finden, wie ich es bei der Postman-Anfrage getan habe.

Der entsprechende Code sieht so 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 in etwa 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 in etwa so:

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

Mir fehlt eindeutig etwas über die Arbeit mit den Response-Objekten in Guzzle. Die Guzzle-Antwort gibt einen 200-Statuscode für die Anfrage an, daher bin ich mir nicht sicher, was ich genau tun muss, um die zurückgegebenen Daten abzurufen.

  • $response->getBody()->getContents() geht nicht?

    – Federkun

    30. Mai 2015 um 17:37 Uhr

Guzzlehttp Wie bekomme ich den Text einer Antwort von
Federkun

Guzzle-Geräte PSR-7. Das bedeutet, dass der Nachrichtentext standardmäßig in a gespeichert wird Strom das temporäre PHP-Streams verwendet. Um alle Daten abzurufen, können Sie den Casting-Operator verwenden:

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

Kann man auch mit machen

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

Der Unterschied zwischen den beiden Ansätzen ist der getContents gibt den restlichen Inhalt zurück, 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

Stattdessen liest es mithilfe der String-Casting-Operationen von PHP alle Daten aus dem Stream vom Anfang bis zum Ende.

$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

  • Die getContents-Funktion befindet sich nur in einem kleinen Teil der Guzzle 6-Dokumentation (im Abschnitt „Streams“), und ich habe sie vermisst. Du hast mir viel Suchen erspart.

    – Maximus

    4. September 2015 um 21:55 Uhr

  • DANKE. Es ist unglaublich, dass dies in der Dokumentation nicht deutlicher wird. Sogar ihre offizielle Dokumentation (docs.guzzlephp.org/en/latest) sieht so aus, als ob der Aufruf von $res->getBody() das zurückgibt, was Sie normalerweise erwarten würden.

    – John

    16. Januar 2016 um 2:54 Uhr

  • Sie sollten wirklich so etwas wie eine Notiz oder einen Hinweis in die offiziellen Dokumente aufnehmen. Ich habe zwei Tage mit diesem Thema verschwendet.

    – cwsu

    29. September 2016 um 2:02 Uhr

  • Sie können auch json_decode verwenden. Schließen Sie beispielsweise Ihre Antwort ein json_decode($response, true); Dies gibt ein Array zurück.

    – Sygon

    6. Februar 2018 um 16:40 Uhr


  • Es wird dringend empfohlen, (string) $response->getBody() nicht zu verwenden, da es nicht wirklich alle Daten abruft. Es ruft die Länge des Standardwerts ab, sodass der tatsächliche Wert abgeschnitten werden kann. github.com/guzzle/guzzle/issues/1610

    – Shardj

    14. Oktober 2019 um 15:41 Uhr

Guzzlehttp Wie bekomme ich den Text einer Antwort von
Maksim Iwanow

Wenn Sie JSON zurückerwarten, ist der einfachste Weg, es zu bekommen:

$data = json_decode($response->getBody()); // returns an object

// OR

$data = json_decode($response->getBody(), true); // returns an array

json_decode() wird automatisch den Körper zu werfen stringalso brauchst du nicht anzurufen getContents().

  • Warum bekommt diese Antwort nicht mehr Aufmerksamkeit??? Das ist genau das, was ich brauchte. Danke @MaskimIvanov

    – Eric McWinNER

    21. Januar 2020 um 20:58 Uhr

  • Das war auch für mich das Einfachste und Leichteste. Danke

    – Alator

    27. März 2020 um 8:09 Uhr

  • Diese einfache Antwort „löst“ das unmittelbare Problem, verfehlt jedoch die Nuance der akzeptierten Antwort von @Federkun. Der Grund, warum dies die meiste Zeit „einfach funktioniert“, ist, dass der Aufruf an json_decode implizit wirft den Antworttext als Zeichenfolge. Allerdings lohnt es sich, die akzeptierte Antwort zu verstehen, da es Probleme mit dem String-Casting-Ansatz geben kann, der nicht immer alle Daten abruft, wie im Kommentar von @Shardj hervorgehoben.

    – j13k

    1. September 2020 um 6:15 Uhr


  • Diese Methode funktioniert, verursacht jedoch Fehler während der statischen Analyse

    – Вася Аристов

    7. Oktober 2020 um 12:59 Uhr

  • Danke!! Ich habe gerade das wahre Schlüsselwort verpasst

    – Katto

    24. November 2021 um 6:49 Uhr

1646549647 253 Guzzlehttp Wie bekomme ich den Text einer Antwort von
Bhargav Variya

Um eine Antwort im JSON-Format zu erhalten:

1.

$response = (string) $res->getBody();
$response =json_decode($response); // Using this you can access any key like below
$key_value = $response->key_name; //access key  
$response = json_decode($res->getBody(),true);
$key_value =   $response['key_name'];//access key

953790cookie-checkGuzzlehttp – Wie bekomme ich den Text einer Antwort von Guzzle 6?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy