Guzzshttp - Làm thế nào để có được phản hồi từ Gu 6?


163

Tôi đang cố gắng viết một trình bao bọc xung quanh một api mà công ty tôi đang phát triển. Thật yên tĩnh và khi sử dụng Người đưa thư, tôi có thể gửi yêu cầu bài đăng đến điểm cuối như http://subdomain.dev.myapi.com/api/v1/auth/với tên người dùng và mật khẩu dưới dạng dữ liệu POST và tôi được trả lại mã thông báo. Tất cả đều hoạt động như mong đợi. Bây giờ, khi tôi thử và làm tương tự từ PHP, tôi nhận lại một GuzzleHttp\Psr7\Responseđối tượng, nhưng dường như không thể tìm thấy mã thông báo ở bất cứ đâu trong đó như tôi đã làm với yêu cầu của Người đưa thư.

Mã liên quan trông như:

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

Đầu ra của mã ở trên trông giống như (cảnh báo, tường văn bản đến):

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

Đầu ra từ Postman là một cái gì đó như:

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

Rõ ràng tôi đang thiếu một cái gì đó về việc làm việc với các đối tượng phản hồi trong Guheads. Phản hồi Guheads chỉ ra 200 mã trạng thái theo yêu cầu, vì vậy tôi không chắc chắn chính xác những gì tôi cần làm để lấy dữ liệu được trả về.


33
$response->getBody()->getContents()không làm việc
Federkun

Câu trả lời:


435

Guheads thực hiện PSR-7 . Điều đó có nghĩa là theo mặc định, nó sẽ lưu trữ nội dung thư trong Luồng sử dụng luồng tạm thời PHP. Để lấy tất cả dữ liệu, bạn có thể sử dụng toán tử truyền:

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

Bạn cũng có thể làm điều đó với

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

Sự khác biệt giữa hai cách tiếp cận là getContentstrả về các nội dung còn lại, để cuộc gọi thứ hai không trả về gì trừ khi bạn tìm kiếm vị trí của luồng với rewindhoặc 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

Thay vào đó, sử dụng các hoạt động đúc chuỗi của PHP, nó sẽ đọc tất cả dữ liệu từ luồng từ đầu cho đến khi kết thúc.

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

Tài liệu: http://docs.guheadsphp.org/en/latest/psr7.html#responses


5
Hàm getContents chỉ có trong một phần nhỏ của tài liệu Guheads 6 (trong phần luồng) và tôi đã bỏ lỡ nó. Bạn đã cứu tôi khỏi rất nhiều tìm kiếm.
Maximus

58
CẢM ƠN BẠN. Thật không thể tin được rằng điều này không rõ ràng hơn trong tài liệu. Ngay cả tài liệu chính thức của họ ( docs.guheadsphp.org/en/latest ) cũng có vẻ như gọi $ res-> getBody () trả về những gì bạn thường mong đợi.
John

24
Họ nên thực sự đặt một cái gì đó như một ghi chú hoặc thông báo trong các tài liệu chính thức. Tôi đã lãng phí hai ngày về vấn đề này.
cwhsu

+1 Tài liệu hướng dẫn giả mạo nói rằng "you can pass true to this method [getBody()] to retrieve the body as a string.". Điều đó dường như không hiệu quả đối với tôi khi sử dụng Gu 6, nhưng chuyển sang chuỗi hoặc sử dụng getContents () không hoạt động.
Magnus W

8
Bạn cũng có thể sử dụng json_decode. Ví dụ, bọc phản hồi của bạn trong json_decode($response, true);này sẽ trả về một mảng.
Đa giác

13

Nếu mong đợi JSON trở lại, cách đơn giản nhất để lấy nó:

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

// OR

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

json_decode()sẽ tự động chuyển cơ thể sang string, do đó không cần phải gọi getContents().


1
Tại sao câu trả lời này không được chú ý nhiều hơn ??? Đây chính xác là những gì tôi cần. Cảm ơn @MaskimIvanov
Eric McWinNEr

Đó cũng là điều đơn giản và dễ dàng nhất đối với tôi. Cảm ơn
Alator
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.