Ранее в Guzzle 5.3:
$response = $client->get('http://httpbin.org/get');
$array = $response->json(); // Yoohoo
var_dump($array[0]['origin']);
Я мог бы легко получить массив PHP из ответа JSON. Теперь в Guzzle 6 я не знаю, как это сделать. Кажется, нет json()
больше метода. Я (быстро) прочитал документ из последней версии и ничего не нашел об ответах JSON. Я думаю, что что-то пропустил, может быть, есть новая концепция, которую я не понимаю (или, возможно, я не правильно прочитал).
Это (ниже) новый способ единственный путь?
$response = $client->get('http://httpbin.org/get');
$array = json_decode($response->getBody()->getContents(), true); // :'(
var_dump($array[0]['origin']);
Или есть помощник или что-то в этом роде?
$response->json()
помощь.->json()
работает оригинал , используйтеjson_decode($response->getBody(), true)
вместо него массив вместо stdObjectstrict_types
, мне нужно было привести тело ответа Guzzle к строке перед тем, как его расшифровать:json_decode((string) $response->getBody(), true)
\GuzzleHttp\json_decode
(или, в\GuzzleHttp\Utils::jsonDecode
зависимости от версии Guzzle, на которой вы работаете), у которой есть совместимая подпись\json_decode
, но выдает исключение в случае ошибки, используя правильную обработку ошибок.Вы переключаетесь на:
Вместо другого комментария, если вы хотите, чтобы он работал точно так же, как и раньше, чтобы получить массивы вместо объектов.
источник
Я использую,
$response->getBody()->getContents()
чтобы получить JSON из ответа. Жрет версию 6.3.0.источник
getContents()
в теле ответа очистит поток, а следующий вызовgetContents()
вернет пустой. Если вы хотите получить тело в виде строки, используйте:strval($response->getBody())
Если вы, ребята, все еще заинтересованы, вот мой обходной путь, основанный на функции промежуточного программного обеспечения Guzzle :
Создать,
JsonAwaraResponse
который будет декодировать ответ JSON поContent-Type
заголовку HTTP, если нет - он будет действовать как стандартный ответ Guzzle:Создайте промежуточное программное обеспечение, которое заменит ответы Guzzle PSR-7 на приведенную выше реализацию Response:
После этого, чтобы получить JSON как собственный массив PHP, используйте Guzzle как всегда:
Проверено с помощью guzzlehttp / guzzle 6.3.3
источник
MessageInterface
. В PSR-7 нет законного решения для исправления этого интерфейса для возврата декодированного JSON изgetBody()
метода.$response
это экземпляр PSR-7ResponseInterface
. Для получения дополнительной информации см. Https://www.php-fig.org/psr/psr-7/#3-interfaces.getBody()
возвращаетStreamInterface
:StreamInterface
реализует__toString()
что делаетПоэтому, чтобы прочитать тело как строку, вы должны привести его к строке:
$stringBody = (string) $response->getBody()
Gotchas
json_decode($response->getBody()
это не лучшее решение, так как оно волшебным образом создает поток для вас.json_decode()
требует строку в качестве 1-го аргумента.$response->getBody()->getContents()
если вы не знаете, что делаете. Если вы читаете документациюgetContents()
, он говорит:Returns the remaining contents in a string
. Следовательно, вызовgetContents()
читает остальную часть потока, а повторный вызов ничего не возвращает, потому что поток уже находится в конце. Вам придется перемотать поток между этими вызовами.источник
Добавление
->getContents()
не возвращает ответ jSON, а возвращается как текст.Вы можете просто использовать
json_decode
источник