programing

Guzzlehttp - Guzzle 6의 응답 본문은 어떻게 얻을 수 있습니까?

goodsources 2022. 9. 13. 22:18
반응형

Guzzlehttp - Guzzle 6의 응답 본문은 어떻게 얻을 수 있습니까?

회사에서 개발하고 있는 api에 대해 래퍼를 작성하려고 합니다.안심하고 Postman을 사용하여 다음과 같은 포스트 요청을 엔드포인트로 보낼 수 있습니다.http://subdomain.dev.myapi.com/api/v1/auth/사용자 이름과 비밀번호를 POST 데이터로 지정하면 토큰이 반환됩니다.모두 예상대로 동작합니다.PHP에서 같은 작업을 시도하면 다시 한 번 수신됩니다.GuzzleHttp\Psr7\Response우체국 요청에서처럼 토큰을 찾을 수 없는 것 같습니다.

관련 코드는 다음과 같습니다.

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

위의 코드 출력은 다음과 같습니다(경고, 텍스트 수신벽).

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

Postman의 결과는 다음과 같습니다.

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

거즐에 있는 응답 오브젝트로 작업하는 것에 대해 뭔가 놓치고 있는 것이 분명합니다.Guzle 응답은 요청에 200 상태 코드를 표시하므로 반환된 데이터를 가져오려면 어떻게 해야 하는지 정확히 모르겠습니다.

거즐은 PSR-7을 실장한다.즉, 기본적으로는 PHP 임시 스트림을 사용하는 스트림에 메시지 본문을 저장합니다.모든 데이터를 검색하려면 주조 연산자를 사용할 수 있습니다.

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

다음 방법으로도 할 수 있습니다.

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

두 접근법의 차이점은getContents나머지 내용을 반환하기 때문에 두 번째 콜은 에서 스트림의 위치를 찾지 않는 한 아무것도 반환하지 않습니다.rewind또는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

대신 PHP의 문자열 캐스팅 작업을 사용하면 스트림의 처음부터 끝까지 모든 데이터를 읽습니다.

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

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

JSON이 돌아올 것으로 예상되는 경우 가장 간단한 방법은 다음과 같습니다.

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

// OR

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

json_decode()자동으로 몸을 던지다string에 전화할 필요가 없습니다.getContents().

JSON 형식의 응답을 얻는 경우:

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

언급URL : https://stackoverflow.com/questions/30549226/guzzlehttp-how-get-the-body-of-a-response-from-guzzle-6

반응형