web-dev-qa-db-ja.com

Guzzle 6 HTTPクライアントでXML応答本文全体を取得する

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();
_

_$body_をVardumpすると、_GuzzleHttp\Psr7\Stream_オブジェクトが返されます。

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

次に、$body->read(1024)を呼び出して、応答から1024バイトを読み取ることができます(xmlで読み取られます)。

ただし、後でSimpleXML拡張を使用して解析する必要があるため、リクエストからXML応答全体を取得したいと思います。

_GuzzleHttp\Psr7\Stream_オブジェクトからXML応答を取得して、解析に使用できるようにするにはどうすればよいですか?

whileは先にループしますか?

_while($body->read(1024)) {
    ...
}
_

助言をいただければ幸いです。

11
luqo33

GuzzleHttp\Psr7\StreamPsr\Http \のコントラクトに影響を与えますMessage\StreamInterface これはあなたに提供する次のものを持っています:

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

オブジェクトを文字列にキャストすると、インターフェイスの一部である基になる__toString()メソッドが呼び出されます。 メソッド名__toString()はPHPでは特別です

実際のストリームハンドルへのアクセスを提供するGuzzleHttp "missed"内の実装として、より多くの "stream-lined"(_stream_copy_to_stream_、_stream_get_contents_または_file_put_contents_などの状況下でのストリームのような)操作。これは一目で明らかではないかもしれません。

14
hakre

私はこのようにそれを作りました:

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パラメーターapplication/xmlでヘッダーを送信します。

4
Toni
$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;
}
2
sNICkerssss
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'your URL');
$response = $response->getBody()->getContents();
return $response;
0
sunshine