source

Guzle 6: 응답에 대한 json() 메서드는 없습니다.

manysource 2023. 1. 27. 21:23

Guzle 6: 응답에 대한 json() 메서드는 없습니다.

Guzzle 5.3 이전 이야기:

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

JSON 응답에서 PHP 어레이를 쉽게 얻을 수 있었습니다.이제 구즐 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을 취득합니다.버젼 6.3.0.

아직 관심이 있으시다면, Guzzle 미들웨어 기능에 근거한 회피책을 다음에 제시하겠습니다.

  1. 만들다JsonAwaraResponseJSON 응답을 디코딩합니다.Content-TypeHTTP 헤더(그렇지 않은 경우) - 표준 Guzzle Response(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 응답을 위의 Response 구현으로 대체하는 미들웨어를 만듭니다.

    <?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/guzle 6.3.3으로 테스트 완료

$responsePSR-7의 인스턴스입니다.ResponseInterface상세한 것에 대하여는, https://www.php-fig.org/psr/psr-7/#3-interfaces 를 참조해 주세요.

getBody()반환:

/**
 * Gets the body of the message.
 *
 * @return StreamInterface Returns the body as a stream.
 */
public function getBody();

StreamInterface용구__toString()어느 쪽인가 하면

스트림의 모든 데이터를 처음부터 끝까지 문자열로 읽습니다.

따라서 본문을 문자열로 읽으려면 문자열에 캐스트해야 합니다.

$stringBody = (string) $response->getBody()


고차스

  1. json_decode($response->getBody()마법처럼 스트림을 스트링에 넣기 때문에 최적의 솔루션은 아닙니다. json_decode()에는 첫 번째 인수로 스트링이 필요합니다.
  2. 사용하지 않다$response->getBody()->getContents()네가 뭘 하는지 모르는 이상 말이야의 메뉴얼을 참조하는 경우getContents()다음과 같이 되어 있습니다.Returns the remaining contents in a string따라서, 전화를 걸겠습니다.getContents()스트림의 나머지 부분을 읽고 다시 호출하면 스트림이 이미 마지막에 있기 때문에 아무것도 반환되지 않습니다.그 통화들 사이에 있는 스트림을 되감아야 할 거야

추가 중->getContents()는 jSON 응답을 반환하지 않고 텍스트로 반환합니다.

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

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