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)) {
...
}
_
助言をいただければ幸いです。
GuzzleHttp\Psr7\Stream は Psr\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
_などの状況下でのストリームのような)操作。これは一目で明らかではないかもしれません。
私はこのようにそれを作りました:
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でヘッダーを送信します。
$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;