Programing

Guzzle 6 : 응답을위한 더 이상 json () 메소드

lottogame 2020. 6. 10. 22:58
반응형

Guzzle 6 : 응답을위한 더 이상 json () 메소드


이전에 Guzzle 5.3에서 :

$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);

JSON 응답에서 PHP 배열을 쉽게 얻을 수 있습니다. 이제 Guzzle 6에서는 어떻게해야할지 모르겠습니다. json()더 이상 방법 이없는 것 같습니다 . 최신 버전의 문서를 (빠르게) 읽고 JSON 응답에 대해 아무것도 찾지 못했습니다. 나는 무언가를 놓쳤다 고 생각합니다. 어쩌면 이해하지 못하는 새로운 개념이있을 수도 있습니다 (또는 아마도 올바르게 읽지 못했을 수도 있습니다).

이것이 (새로운 방법) 유일한 방법입니까?

$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);

아니면 도우미 또는 그런 것이 있습니까?


나는 json_decode($response->getBody())대신에 지금 사용 $response->json()합니다.

나는 이것이 PSR-7 준수의 희생자 일 것으로 생각합니다.


다음으로 전환하십시오.

json_decode($response->getBody(), true)

객체 대신 배열을 얻기 위해 이전과 동일하게 작동하려면 다른 주석 대신.


$response->getBody()->getContents()응답에서 JSON을 얻는 데 사용 합니다. Guzzle 버전 6.3.0.


여전히 관심이 있다면 Guzzle 미들웨어 기능을 기반으로 한 내 해결 방법 은 다음과 같습니다.

  1. HTTP 헤더로 JsonAwaraResponseJSON 응답을 디코딩하는 작성 Content-Type-그렇지 않은 경우 표준 Guzzle 응답으로 작동합니다.

    <?php
    
    namespace GuzzleHttp\Psr7;
    
    
    class JsonAwareResponse extends Response
    {
        /**
         * Cache for performance
         * @var array
         */
        private $json;
    
        public function getBody()
        {
            if ($this->json) {
                return $this->json;
            }
            // get parent Body stream
            $body = parent::getBody();
    
            // if JSON HTTP header detected - then decode
            if (false !== strpos($this->getHeaderLine('Content-Type'), 'application/json')) {
                return $this->json = \json_decode($body, true);
            }
            return $body;
        }
    }
    
  2. Guzzle PSR-7 응답을 위의 응답 구현으로 대체 할 미들웨어작성하십시오 .

    <?php
    
    $client = new \GuzzleHttp\Client();
    
    /** @var HandlerStack $handler */
    $handler = $client->getConfig('handler');
    $handler->push(\GuzzleHttp\Middleware::mapResponse(function (\Psr\Http\Message\ResponseInterface $response) {
        return new \GuzzleHttp\Psr7\JsonAwareResponse(
            $response->getStatusCode(),
            $response->getHeaders(),
            $response->getBody(),
            $response->getProtocolVersion(),
            $response->getReasonPhrase()
        );
    }), 'json_decode_middleware');
    

이 후 JSON을 PHP 기본 배열로 검색하려면 항상 Guzzle을 사용하십시오.

$jsonArray = $client->get('http://httpbin.org/headers')->getBody();

guzzlehttp / guzzle 6.3.3으로 테스트


추가하면 ->getContents()jSON 응답이 반환되지 않고 대신 텍스트로 반환됩니다.

간단하게 사용할 수 있습니다 json_decode

참고 URL : https://stackoverflow.com/questions/30530172/guzzle-6-no-more-json-method-for-responses

반응형