Intereting Posts
__destruct в __construct? Как ранжировать значения массива с повторяющимися значениями и пропускать некоторые позиции, если есть связь? Закрытие соединения MySQL после каждого запроса Ошибка мыла, Кодирование: объект не имеет свойства «RecordId» Вход в систему Opencart Force, когда вы видите страницу Cart? Как вызвать пакет из php, имеющий процедуру в oracle, используя драйверы oci? Предварительная обработка PHP для удаления функциональности из встроенных файлов PHP и MySQL Выберите одно значение PHP получает значение опции выбора Передать переменные между двумя страницами PHP без использования формы или URL-адреса страницы API-интерфейс SoftLayer Nessus Scan Status / Report через PHP Как получить связанный объект Propel ORM Подавать файл пользователю через http через php Добавьте «.active» класс к ссылке текущей страницы в меню с помощью jQuery или PHP Найти текст без какого-либо тега в элементе div

Извлечение всего тела ответа XML с помощью HTTP-клиента Guzzle 6

Я хотел использовать Guzzle 6 для получения ответа xml от удаленного API. Это мой код:

$client = new Client([ 'base_uri' => '<my-data-endpoint>', ]); $response = $client->get('<URI>', [ 'query' => [ 'token' => '<my-token>', ], 'headers' => [ 'Accept' => 'application/xml' ] ]); $body = $response->getBody(); 

Vardumping $body вернет объект GuzzleHttp\Psr7\Stream :

 object(GuzzleHttp\Psr7\Stream)[453] private 'stream' => resource(6, stream) ... ... 

Затем я мог бы вызвать $body->read(1024) чтобы прочитать 1024 байта из ответа (который будет читать в xml).

Тем не менее, я хотел бы получить весь ответ XML от моего запроса, так как мне нужно будет его проанализировать позже, используя расширение SimpleXML .

Как я могу наилучшим образом получить ответ XML от GuzzleHttp\Psr7\Stream чтобы его можно было использовать для синтаксического анализа?

Пройдет ли цикл while?

 while($body->read(1024)) { ... } 

Буду признателен за ваш совет.

Related of "Извлечение всего тела ответа XML с помощью HTTP-клиента Guzzle 6"

GuzzleHttp \ Psr7 \ Stream реализует контракт Psr \ Http \ Message \ StreamInterface, который предлагает следующее:

 /** @var $body GuzzleHttp\Psr7\Stream */ $contents = (string) $body; 

Приведение объекта в строку вызовет базовый __toString() который является частью интерфейса. Имя метода __toString() является специальным в PHP .

Поскольку реализация в GuzzleHttp «пропущена» для обеспечения доступа к фактическому дескриптору потока, поэтому вы не можете использовать потоковые функции PHP, которые позволяют выполнять более «потоковые» ( потоковые ) операции при таких обстоятельствах, как stream_copy_to_stream , stream_get_contents или file_put_contents . Это может быть не очевидно с первого взгляда.

Я сделал это так:

 public function execute ($url, $method, $headers) { $client = new GuzzleHttpConnection(); $response = $client->execute($url, $method, $headers); return $this->parseResponse($response); } protected function parseResponse ($response) { return new SimpleXMLElement($response->getBody()->getContents()); } 

Мое приложение возвращает содержимое в строке с подготовленным XML-контентом, а запрос Guzzle отправляет заголовки с приложением param application / xml .

 $client = new \GuzzleHttp\Client(); $response = $client->request('GET', $request_url, [ 'headers' => ['Accept' => 'application/xml'], 'timeout' => 120 ])->getBody()->getContents(); $responseXml = simplexml_load_string($response); if ($responseXml instanceof \SimpleXMLElement) { $key_value = (string)$responseXml->key_name; } 
 $client = new \GuzzleHttp\Client(); $response = $client->request('GET', 'your URL'); $response = $response->getBody()->getContents(); return $response;