2010-06-09 9 views
33

Cela m'a embêté pendant des jours; J'essaie d'envoyer un message SOAP via Curl mais je continue à recevoir une erreur "impossible de se connecter à l'hôte", mais je ne vois vraiment pas comment.Comment envoyer du XML SOAP via Curl et PHP?

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 une chose PHP/Curl.

J'ai actuellement le code suivant (les données CURLOPT_POSTFIELDS 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'; 
} 

donc des idées pourquoi il juste des erreurs tout le temps?

La version ASP fonctionne 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>') 

Répondre

35

Merci beaucoup mon pote, 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); 
+2

Je n'ai jamais eu de réponse qui a fonctionné pour moi, et c'était il y a plus de 2 ans maintenant.Les gens semblent trouver cette réponse utile, donc je vais la marquer comme la réponse.Merci –

+0

Quelqu'un peut-il m'aider avec le vice vice versa tourner la demande de boucle comme ci-dessus à une demande soapclient? – mahen3d

2

Essayez de définir le numéro de port à l'aide CURLOPT_PORT comme peut-être ce n'est pas goût dans le cadre de l'URL?

+0

déjà essayé que l'un et cela ne fonctionne pas:/Merci bien pour l'idée –

11

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); 
+0

Merci Dom, je vais vous donner un coup plus tard et vous faire savoir si cela a fonctionné pour moi :) –

+0

Malheureusement, cela n'a pas fonctionné pour moi :( –

+1

+1 pour SOAPAction: "run" .C'était le morceau manquant requis par mon serveur de savon – JasonWoof

1

Votre utilisation aussi le mauvais type de contenu, application/xml est le type correct. Mais cela ne devrait pas faire de différence dans la requête cURL.

4

Pour ceux qui trouvent cela de Google, je suis tombé sur un problème similaire, en essayant d'interagir avec un serveur SOAP .NET à partir 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 incluait 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); 
+1

Après 2 jours de travail pourquoi il ne fonctionnait pas, cela l'a réparé! – Josh

3

Cela peut être vieux, mais cela fonctionne pour moi. J'ai eu à l'origine de cette fonction pour un poste XML et du savon ne travaillerais jusqu'à ce que je change la 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; 
}