2015-05-30 3 views
82

Ich versuche, einen Wrapper um eine API zu schreiben, die sich in meiner 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. Jetzt, wenn ich versuche und dasselbe von PHP mache, bekomme ich ein GuzzleHttp\Psr7\Response Objekt zurück, aber ich kann nicht scheinen, das Token irgendwo innerhalb davon zu finden, wie ich mit der Postman-Anfrage getan habe.Guzzehtttp - Wie bekommen Sie den Körper einer Antwort von Guzzle 6?

Der entsprechende Code wie folgt aussieht:

$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 Code sieht ungefähr so ​​aus (Warnung, eingehende Wand Text):

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 so etwas wie:

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

Offensichtlich fehlt mir etwas über die Arbeit mit den Antwortobjekten in Gu zzle. Die Guzzle-Antwort gibt einen 200-Statuscode für die Anforderung an. Daher bin ich nicht sicher, was genau ich tun muss, um die zurückgegebenen Daten abzurufen.

+19

'$ response-> getBody() -> getContents()' funktioniert nicht? – Federkun

+3

Sie schönes Genie @ Leggendario. Du bist eine Legende in deiner eigenen Zeit. Ich weiß nicht, wie ich 'getContents()' vorher gefunden habe. – Greg

Antwort

241

Guzzle implementiert PSR-7. Das bedeutet, dass der Hauptteil einer Nachricht standardmäßig in einem Stream gespeichert wird, der PHP-Temp-Streams verwendet. Um alle Daten abzurufen, können Sie Casting-Operator verwenden:

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

Sie können es auch tun mit

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

Der Unterschied zwischen den beiden Ansätzen ist, dass getContents kehrt der restliche Inhalt, so dass eine zweite Der Aufruf gibt nichts zurück, wenn Sie nicht die Position des Datenstroms mit rewind oder seek suchen.

$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 usings PHP-String Gießarbeiten, es werden alle Daten aus dem Stream von Anfang an liest, bis das Ende erreicht ist.

$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

+4

Die getContents-Funktion ist nur in einem kleinen Teil der Guzzle 6-Dokumentation (in der Streams-Sektion), und ich habe es verpasst. Du hast mich vor vielen Suchen gerettet. – Maximus

+26

DANKE. Es ist unglaublich, dass dies in der Dokumentation nicht mehr klar ist. Sogar ihre offizielle Dokumentation (http://docs.guzzlephp.org/en/latest/) lässt es so aussehen, als würde $ res-> getBody() aufrufen, was man normalerweise erwartet. – John

+9

Sie sollten wirklich etwas wie eine Notiz oder eine Notiz in die offiziellen Dokumente einfügen. Ich habe zwei Tage mit diesem Thema verschwendet. – cwhsu

Verwandte Themen