web-dev-qa-db-fra.com

Comment puis-je envoyer SOAP XML via Curl et PHP?

Cela me dérange depuis des jours; J'essaie d'envoyer un message SOAP via Curl, mais je continue de recevoir une erreur "Impossible de se connecter à l'hôte", mais je ne vois vraiment pas comment.

J'ai une version ASP qui fonctionne très bien avec la même URL et les mêmes données. Je pense que c'est juste une chose PHP/Curl.

J'ai actuellement le code suivant (le CURLOPT_POSTFIELDS les données sont une SOAP valide):

$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL,            "https://xxx.yyy.com:517/zzz.asmx" );
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($soap_do, CURLOPT_TIMEOUT,        10);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($soap_do, CURLOPT_POST,           true );            
curl_setopt($soap_do, CURLOPT_POSTFIELDS,     '<soap:Envelope>...</soap:Envelope>'); 
curl_setopt($soap_do, CURLOPT_HTTPHEADER,     array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen('<soap:Envelope>...</soap:Envelope>') ));

if(curl_exec($soap_do) === false)
{                
    $err = 'Curl error: ' . curl_error($soap_do);
    curl_close($soap_do);
    return $err;
}
else
{
    curl_close($soap_do); 
    return 'Operation completed without any errors';
}

Donc, des idées pourquoi cela ne fait que des erreurs tout le temps?

La version ASP fonctionne très bien! Le code est:

Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST","https://xxx.yyy.com:517/zzz.asmx"
xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
xmlhttp.Send('<soap:Envelope>...</soap:Envelope>')
34
dan richardson

Merci beaucoup, votre code a fonctionné pour moi.

Voici le code:

$soap_do = curl_init(); 
curl_setopt($soap_do, CURLOPT_URL,            $url );   
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($soap_do, CURLOPT_TIMEOUT,        10); 
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($soap_do, CURLOPT_POST,           true ); 
curl_setopt($soap_do, CURLOPT_POSTFIELDS,    $post_string); 
curl_setopt($soap_do, CURLOPT_HTTPHEADER,     array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($post_string) )); 
curl_setopt($soap_do, CURLOPT_USERPWD, $user . ":" . $password);

$result = curl_exec($soap_do);
$err = curl_error($soap_do);  
37
Syn

Je devais utiliser

$headers = array(             
    "Content-type: text/xml;charset=\"utf-8\"", 
    "Accept: text/xml", 
    "Cache-Control: no-cache", 
    "Pragma: no-cache", 
    "SOAPAction: \"run\"", 
    "Content-length: ".strlen($xml),
); 

et

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
11
Dom Hodgson

Pour ceux qui trouvent cela sur Google, j'ai rencontré un problème similaire, en essayant d'interagir avec un serveur .NET SOAP de PHP, lorsque la méthode ASP a bien fonctionné) .

J'ai utilisé un renifleur de paquets pour voir exactement ce que le client ASP envoyait, et j'ai remarqué qu'il comprenait des cookies après la demande d'authentification initiale. J'ai donc activé les cookies dans mon cURL et cela a bien fonctionné.

$cookiePath = tempnam('/tmp', 'cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
4
Tobias Fünke

C'est peut-être vieux, mais ça marche pour moi. Au départ, j'avais cette fonction pour une publication XML et soap ne fonctionnerait pas tant que je n'aurais pas changé le HTTPHEADER en text/xml au lieu de application/xml:

function doXMLCurl($url,$postXML){
    $CURL = curl_init();

    curl_setopt($CURL, CURLOPT_URL, $url); 
    curl_setopt($CURL, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($CURL, CURLOPT_POST, 1); 
    curl_setopt($CURL, CURLOPT_POSTFIELDS, $postXML); 
    curl_setopt($CURL, CURLOPT_HEADER, false); 
    curl_setopt($CURL, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($CURL, CURLOPT_HTTPHEADER, array('Accept: text/xml','Content-Type: text/xml'));
    curl_setopt($CURL, CURLOPT_RETURNTRANSFER, true);
    $xmlResponse = curl_exec($CURL); 

    return $xmlResponse;
}
3
dev7apps

Essayez de définir le numéro de port à l'aide de CURLOPT_PORT car il ne l'aime peut-être pas dans le cadre de l'URL?

2
Alistair

Vous utilisez également le mauvais type de contenu, application/xml est le bon type. Mais cela ne devrait pas faire de différence pour la demande cURL.

1
Adam