Я хотел использовать 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)) { ... }
Буду признателен за ваш совет.
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;