Utilisation de la Guzzle pour consommer du savon

j'adore le cadre de Guzzle que je viens de découvrir. Je l'utilise pour agréger des données à travers plusieurs API en utilisant différentes structures de réponse. Cela a fonctionné trouver avec JSON et XML, mais un des services que je dois consommer utilise SOAP. Y a-t-il une façon intégrée de consommer des services de savon avec Guzzle?

17
demandé sur LordZardeck 2013-10-04 03:35:05

3 réponses

vous pouvez demander à Guzzle d'envoyer des requêtes SOAP. Notez que le savon a toujours une enveloppe, une tête et un corps.

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
        <NormalXmlGoesHere>
            <Data>Test</Data>
        </NormalXmlGoesHere>
    </soapenv:Body>

la première chose que je fais est de construire le corps xml avec SimpleXML:

$xml = new SimpleXMLElement('<NormalXmlGoesHere xmlns="https://api.xyz.com/DataService/"></NormalXmlGoesHere>');
$xml->addChild('Data', 'Test');

// Removing xml declaration node
$customXML = new SimpleXMLElement($xml->asXML());
$dom = dom_import_simplexml($customXML);
$cleanXml = $dom->ownerDocument->saveXML($dom->ownerDocument->documentElement);

nous enveloppons ensuite notre corps xml avec l'enveloppe soap, l'en-tête et le corps.

$soapHeader = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>';

$soapFooter = '</soapenv:Body></soapenv:Envelope>';

$xmlRequest = $soapheader . $cleanXml . $soapFooter; // Full SOAP Request

nous devons ensuite trouver quel est notre paramètre dans les documents de l'api.

nous construisons alors le client dans Guzzle:

$client = new Client([
    'base_url' => 'https://api.xyz.com',
]);

try {
    $response = $client->post(
    '/DataServiceEndpoint.svc',
        [
            'body'    => $xmlRequest,
            'headers' => [
            'Content-Type' => 'text/xml',
            'SOAPAction' => 'https://api.xyz.com/DataService/PostData' // SOAP Method to post to
            ]
        ]
    );

    var_dump($response);
} catch (\Exception $e) {
    echo 'Exception:' . $e->getMessage();
}

if ($response->getStatusCode() === 200) {
    // Success!
    $xmlResponse = simplexml_load_string($response->getBody()); // Convert response into object for easier parsing
} else {
    echo 'Response Failure !!!';
}
5
répondu acnc111 2017-07-14 02:40:14

IMHO Guzzle n'a pas le support SOAP complet et ne fonctionne qu'avec les requêtes HTTP. src/Guzzle/Http / ClientInterface.ligne php: 76

public function createRequest(                                              
    $method = RequestInterface::GET,                                        
    $uri = null,                                                            
    $headers = null,                                                        
    $body = null,                                                           
    array $options = array()                                                
); 

même si SOAP server est configuré pour négocier sur le port 80 je pense que php SoapClient est la solution la plus appropriée ici car il supporte WSDL

4
répondu ishenkoyv 2014-02-13 06:59:40

ancien sujet, mais comme je cherchais la même réponse, il semble async-savon-bouffer fait le boulot.

4
répondu Raphael1px 2016-08-31 08:24:31