Je voulais utiliser Guzzle 6 pour récupérer une réponse XML à partir d'une API distante. Ceci est mon code:
$client = new Client([
'base_uri' => '<my-data-endpoint>',
]);
$response = $client->get('<URI>', [
'query' => [
'token' => '<my-token>',
],
'headers' => [
'Accept' => 'application/xml'
]
]);
$body = $response->getBody();
Vardumping le $body
retournerait un objet GuzzleHttp\Psr7\Stream
:
object(GuzzleHttp\Psr7\Stream)[453]
private 'stream' => resource(6, stream)
...
...
Je pourrais alors appeler $body->read(1024)
pour lire 1024 octets dans la réponse (qui se lirait en XML).
Cependant, j'aimerais récupérer l'intégralité de la réponse XML à partir de ma demande car je devrais l'analyser ultérieurement à l'aide de l'extension SimpleXML
.
Comment récupérer au mieux la réponse XML à partir de l'objet GuzzleHttp\Psr7\Stream
afin qu'il soit utilisable pour l'analyse?
La while
ferait-elle le chemin?
while($body->read(1024)) {
...
}
J'apprécierais votre conseil.
Le GuzzleHttp\Psr7\Stream implémente le contrat de Psr\Http\Message\StreamInterface qui a les caractéristiques suivantes à vous offrir:
/** @var $body GuzzleHttp\Psr7\Stream */
$contents = (string) $body;
Convertir l'objet en chaîne appellera la méthode __toString()
sous-jacente qui fait partie de l'interface. Le nom de la méthode __toString()
est spécial dans PHP .
En tant qu'implémentation dans GuzzleHttp _ "manquée" pour fournir un accès au handle de flux actuel, vous ne pouvez donc pas utiliser les fonctions de flux de PHP qui permettent davantage de "lignes alignées" (de type flux) opérations dans des circonstances telles que stream_copy_to_stream
, stream_get_contents
ou file_put_contents
. Cela pourrait ne pas être évident à première vue.
Je l'ai fait de cette façon:
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());
}
Mon application renvoie le contenu sous forme de chaîne avec un contenu XML préparé et la requête Guzzle envoie les en-têtes avec accept 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;