34 votes

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

J'essaie d'envoyer un message SOAP via Curl, mais j'obtiens toujours l'erreur "impossible de se connecter à l'hôte", mais je ne vois vraiment pas comment.

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

J'ai actuellement le code suivant (le CURLOPT_POSTFIELDS data est une chaîne d'enveloppe 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';
}

Vous avez une idée de la raison pour laquelle il se trompe tout le temps ?

La version ASP fonctionne bien ! Le code est le suivant :

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>')

37voto

Syn Points 226

Merci beaucoup mon ami, 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);

11voto

Dom Hodgson Points 183

J'ai dû 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);

4voto

Tobias Fünke Points 566

Pour ceux qui trouvent cette information sur Google, j'ai rencontré un problème similaire en essayant d'interagir avec un serveur SOAP .NET depuis PHP, alors que la méthode ASP fonctionnait bien.

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

$cookiePath = tempnam('/tmp', 'cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);

3voto

dev7apps Points 23

C'est peut-être vieux, mais ça marche pour moi. À l'origine, j'avais cette fonction pour un message XML et le savon ne fonctionnait pas jusqu'à ce que je modifie l'attribut HTTPHEADER à 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;
}

2voto

Alistair Points 1174

Essayez de définir le numéro de port en utilisant CURLOPT_PORT, car il n'aime peut-être pas qu'il fasse partie de l'URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X