Guzzlehttp - Guzzle 6'dan nasıl bir yanıt alırsınız?


163

Şirketimin geliştirdiği bir API'nin etrafına bir sarıcı yazmaya çalışıyorum. Dinlendirici ve Postacı'yı kullanarak http://subdomain.dev.myapi.com/api/v1/auth/POST verileri olarak kullanıcı adı ve parola gibi bir uç noktaya bir posta isteği gönderebilirim ve bana bir jeton veriliyor. Tüm işler beklendiği gibi. Şimdi, ben denemek ve PHP aynı şeyi yapmak bir GuzzleHttp\Psr7\Responsenesne geri almak , ama Postacı isteği ile yaptığım gibi içindeki herhangi bir belirteç bulmak gibi görünmüyor.

İlgili kod şuna benzer:

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

Yukarıdaki kodun çıktısı şuna benzer (uyarı, metnin gelen duvarı):

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

Postacı'nın çıktısı şuna benzerdi:

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

Açıkça Guzzle'daki yanıt nesneleriyle çalışmayla ilgili bir şey eksik. Guzzle yanıtı istekte bir 200 durum kodu gösterir, bu yüzden döndürülen verileri almak için tam olarak ne yapmam gerektiğinden emin değilim.


33
$response->getBody()->getContents()çalışmıyor mu?
Federkun

Yanıtlar:


437

Guzzle PSR-7'yi uygular . Bu, varsayılan olarak bir iletinin gövdesini PHP temp akışlarını kullanan bir Akışta depolayacağı anlamına gelir . Tüm verileri almak için döküm operatörünü kullanabilirsiniz:

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

İle de yapabilirsiniz

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

İki yaklaşım arasındaki fark, getContentsgeri kalan içerikleri döndürür; böylece, akışın konumunu rewindveya ile aramadığınız sürece ikinci bir çağrı hiçbir şey döndürmez 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

Bunun yerine, PHP'nin dize döküm işlemlerini kullanır, akıştan baştan sona kadar tüm verileri okuyacaktır.

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

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


5
GetContents işlevi, Guzzle 6 belgelerinin yalnızca küçük bir bölümünde (akışlar bölümünde) bulunur ve kaçırdım. Beni bir sürü aramadan kurtardın.
Maximus

58
TEŞEKKÜR EDERİM. Bunun dokümantasyonda daha açık olmaması inanılmaz. Resmi belgeleri ( docs.guzzlephp.org/en/latest ) bile $ res-> getBody () çağrısı normalde beklediğinizi döndürür.
John

24
Resmi belgelere gerçekten not veya uyarı gibi bir şey koymalıdırlar. Bu konuda iki gün harcadım.
cwhsu

+1 Guzzle belgeleri bunu yanlış bir şekilde belirtir "you can pass true to this method [getBody()] to retrieve the body as a string.". Guzzle 6 kullanarak benim için işe yaramıyor gibi görünüyor, ancak dizeye döküm veya getContents () kullanmak işe yarıyor.
Magnus W

8
Json_decode da kullanabilirsiniz. Örneğin, yanıtınızı buna sarın json_decode($response, true);bir dizi döndürür.
Sygon

13

JSON'u geri bekliyorsanız, bunu almanın en basit yolu:

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

// OR

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

json_decode()otomatik olarak vücudu dökecek string, bu yüzden aramanıza gerek yok getContents().


1
Bu cevap neden daha fazla ilgi görüyor ??? Tam da ihtiyacım olan şey bu. @MaskimIvanov
Eric McWinNEr

Bu benim için de en basit ve kolay şeydi. Teşekkürler
Alator
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.