使用Guzzle 6 HTTP Client检索整个XML响应主体

时间:2015-08-03 09:42:59

标签: php xml http guzzle

我想使用Guzzle 6从远程API检索xml响应。这是我的代码:

$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扩展名解析它。

如何从GuzzleHttp\Psr7\Stream对象中最佳地检索XML响应,以便它可用于解析?

while会循环吗?

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

我很感激你的意见。

4 个答案:

答案 0 :(得分:12)

GuzzleHttp\Psr7\Stream实施Psr\Http\Message\StreamInterface的合同,其中包含以下内容:

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

将对象转换为字符串将调用作为接口一部分的基础__toString()方法。 method name __toString() is special in PHP

由于 GuzzleHttp 中的实现“错过”提供对实际流句柄的访问,因此您无法利用PHP的流功能,这允许更多“流线型”(类似于流的)操作,例如stream_copy_to_streamstream_get_contentsfile_put_contents。这可能在第一眼看上去并不明显。

答案 1 :(得分:4)

我是这样做的:

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请求发送带有accept param application / xml 的标头。

答案 2 :(得分:2)

a/b.xml

答案 3 :(得分:0)

$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'your URL');
$response = $response->getBody()->getContents();
return $response;