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 미들웨어 기능에 근거한 회피책을 다음에 제시하겠습니다.
만들다
JsonAwaraResponse
JSON 응답을 디코딩합니다.Content-Type
HTTP 헤더(그렇지 않은 경우) - 표준 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; } }
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으로 테스트 완료
$response
PSR-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()
고차스
json_decode($response->getBody()
마법처럼 스트림을 스트링에 넣기 때문에 최적의 솔루션은 아닙니다.json_decode()
에는 첫 번째 인수로 스트링이 필요합니다.- 사용하지 않다
$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
'source' 카테고리의 다른 글
WAMP에서 MySql을 MariaDb로 대체하는 방법 (0) | 2023.01.27 |
---|---|
MARIADB: 범위에 조인된 선택 항목에는 인덱스가 사용되지 않습니다. (0) | 2023.01.27 |
포인터로 붕괴되는 어레이에 대한 예외? (0) | 2023.01.27 |
아스타리스크*는 Python에서 무엇을 의미합니까? (0) | 2023.01.27 |
"GROUP BY"의 모든 항목 수에 대한 "카운트(*)"의 백분율 가져오기 (0) | 2023.01.27 |