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>')
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);
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);
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);
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;
}
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?
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.