Wcześniej w Guzzle 5.3:
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);
Mogłem łatwo uzyskać tablicę PHP z odpowiedzi JSON. Teraz w Guzzle 6 nie wiem, jak to zrobić. Wydaje się, że nie ma json()
już metody. Przeczytałem (szybko) dokument z najnowszej wersji i nie znalazłem nic o odpowiedziach JSON. Myślę, że coś przeoczyłem, może jest nowa koncepcja, której nie rozumiem (a może nie przeczytałem poprawnie).
Czy to (poniżej) nowy sposób jest jedynym sposobem?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);
A może jest pomocnik lub coś takiego?
$response->json()
pomocnika.->json()
działała oryginał , użyjjson_decode($response->getBody(), true)
zamiast tego, aby uzyskać tablicę zamiast stdObjectstrict_types
, musiałem rzucić treść odpowiedzi Guzzle na łańcuch przed jej odkodowaniem:json_decode((string) $response->getBody(), true)
\GuzzleHttp\json_decode
(lub w\GuzzleHttp\Utils::jsonDecode
zależności od wersji Guzzle), który ma zgodny podpis\json_decode
, ale zgłasza wyjątek, jeśli wystąpi błąd, wykorzystując odpowiednią obsługę błędów.Przełączasz się na:
Zamiast drugiego komentarza, jeśli chcesz, aby działał dokładnie tak, jak poprzednio, aby uzyskać tablice zamiast obiektów.
źródło
Używam,
$response->getBody()->getContents()
aby uzyskać JSON z odpowiedzi. Guzzle w wersji 6.3.0.źródło
getContents()
w treści odpowiedzi spowoduje opróżnienie strumienia, a następne wywołaniegetContents()
zwróci puste. Jeśli chcesz uzyskać ciało jako ciąg, użyj:strval($response->getBody())
Jeśli nadal jesteś zainteresowany, oto moje obejście oparte na funkcji oprogramowania pośredniego Guzzle :
Utwórz
JsonAwaraResponse
, który zdekoduje odpowiedź JSON przezContent-Type
nagłówek HTTP, jeśli nie - będzie działać jako standardowa odpowiedź Guzzle:Utwórz oprogramowanie pośredniczące, które zastąpi odpowiedzi Guzzle PSR-7 powyższą implementacją odpowiedzi:
Następnie, aby pobrać JSON jako natywną tablicę PHP, użyj Guzzle jak zawsze:
Przetestowano za pomocą guzzlehttp / guzzle 6.3.3
źródło
MessageInterface
. W PSR-7 nie ma legalnego rozwiązania, aby załatać ten interfejs w celu zwrócenia zdekodowanego JSON zgetBody()
metody.$response
jest instancją PSR-7ResponseInterface
. Aby uzyskać więcej informacji, zobacz https://www.php-fig.org/psr/psr-7/#3-interfacesgetBody()
zwracaStreamInterface
:StreamInterface
narzędzia,__toString()
które to robiąDlatego, aby odczytać ciało jako ciąg, musisz rzucić je na łańcuch:
$stringBody = (string) $response->getBody()
Gotchas
json_decode($response->getBody()
nie jest najlepszym rozwiązaniem, ponieważ w magiczny sposób rzuca strumień na sznurek.json_decode()
wymaga łańcucha jako pierwszego argumentu.$response->getBody()->getContents()
chyba że wiesz, co robisz. Jeśli czytać dokumentacjęgetContents()
, to mówi:Returns the remaining contents in a string
. Dlatego wywołaniegetContents()
odczytuje resztę strumienia, a wywołanie go ponownie nie zwraca niczego, ponieważ strumień jest już na końcu. Musiałbyś przewijać strumień między tymi połączeniami.źródło
Dodanie
->getContents()
nie zwraca odpowiedzi jSON, zamiast tego zwraca jako tekst.Możesz po prostu użyć
json_decode
źródło