web-dev-qa-db-fra.com

Récupérer l'intégralité du corps de la réponse XML avec le client HTTP Guzzle 6

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.

11
luqo33

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.

12
hakre

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  

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