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?
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 !!!';
}
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
ancien sujet, mais comme je cherchais la même réponse, il semble async-savon-bouffer fait le boulot.