2015-08-03 4 views
8

Ich wollte Guzzle 6 verwenden, um eine XML-Antwort von einer Remote-API abzurufen. Dies ist mein Code:Rufen Sie den gesamten XML-Antworttext mit Guzzle 6 HTTP Client ab.

$client = new Client([ 
    'base_uri' => '<my-data-endpoint>', 
]); 
$response = $client->get('<URI>', [ 
    'query' => [ 
     'token' => '<my-token>', 
    ], 
    'headers' => [ 
     'Accept' => 'application/xml' 
    ] 
]); 
$body = $response->getBody(); 

Vardumping die $body würde ein GuzzleHttp\Psr7\Stream Objekt zurückgeben:

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

Ich konnte dann $body->read(1024) rufen 1024 Bytes aus der Antwort zu lesen (die in XML lesen würde).

Allerdings möchte ich die gesamte XML-Antwort von meiner Anfrage abrufen, da ich es später unter Verwendung der SimpleXML Erweiterung analysieren müssen.

Wie kann ich am besten die XML-Antwort von GuzzleHttp\Psr7\Stream Objekt abrufen, so dass es für das Parsen verwendbar ist?

Würde die while Schleife den Weg gehen?

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

Ich würde mich über Ihren Rat freuen.

Antwort

9

Die GuzzleHttp\Psr7\Stream implemtents der Vertrag von Psr\Http\Message\StreamInterface die Ihnen folgendes zu bieten hat:

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

das Objekt String Casting wird die zugrunde liegende __toString() Methode aufrufen, die einen Teil der Schnittstelle ist. Die method name __toString() is special in PHP.

Da die Umsetzung innerhalb GuzzleHttp „verpaßt“ Zugriff auf den tatsächlichen Strom Griff zur Verfügung zu stellen, so dass Sie nicht Verwendung von PHP-Stream-Funktionen machen, die mehr „stream-lined“ (Strom artige) Operationen erlaubt unter Umständen, wie stream_copy_to_stream, stream_get_contents oder file_put_contents. Dies ist auf den ersten Blick nicht offensichtlich.

+0

Danke Sir! Ich habe nicht daran gedacht, den gesamten Antworttext auf String zu setzen. – luqo33

+0

Ich stehe vor dem gleichen Problem. Könnten Sie Ihre Antwort mit einer Schritt für Schritt Lösung ausarbeiten? Wie würde der vollständige Code jetzt aussehen? – davejal

3

ich es so gemacht:

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

Meine Anwendung gibt Inhalte in String mit XML bereit Inhalt und Guzzle Anfrage sendet Header mit param application/xml akzeptieren.

+0

Ich benutze Laravel und habe einen Fehler, die Klasse 'SimpleXMLElement' wurde nicht gefunden. Hast du eine einfache Lösung? – davejal

+0

Verwenden Sie phpinfo(), um Informationen zu erhalten, wenn die SimpleXML-Erweiterung in Ihrem PHP aktiviert oder deaktiviert ist. Wenn Sie PHP neuer als 5.1.2 verwenden, sollte die SimpleXML-Erweiterung standardmäßig aktiviert sein. – Toni

+0

Ja, es ist aktiviert und meine Version ist 5.5.11. Irgendwelche anderen Überprüfungen könnte ich tun? – davejal

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