2010-06-09 37 views
33

Questo mi ha infastidito per giorni; Sto cercando di inviare un post SOAP tramite Curl, ma continuo a ricevere un errore "impossibile connettersi all'host", ma non riesco davvero a vedere come.Come posso inviare SOAP XML tramite Curl e PHP?

Ho una versione ASP che funziona perfettamente con lo stesso URL e dati. Penso che sia solo una cosa PHP/Curl.

Al momento ho il seguente codice (i dati CURLOPT_POSTFIELDS è un sapone stringa busta valido):

$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'; 
} 

Quindi tutte le idee per cui esso diventa subito errori per tutto il tempo?

La versione ASP funziona perfettamente! Il codice è:

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

risposta

35

Grazie mille amico, il tuo codice ha funzionato per me.

Ecco il codice:

$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

Non ho mai avuto una risposta che funzionasse per me, e questo era più di 2 anni fa.Le persone sembrano trovare utile questa risposta, quindi la contrassegnerò come risposta.Grazie –

+0

Qualcuno può aiutarmi con il vizio versa di questo trasformare la richiesta di arricciatura come sopra in una richiesta soapclient? – mahen3d

2

Provare e impostare il numero di porta utilizzando CURLOPT_PORT come forse non gli piace come parte dell'URL?

+0

già provato quello e non funziona:/Grazie comunque per l'idea –

11

ho dovuto usare

$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), 
); 

e

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
+0

Grazie Dom, ti darò uno scatto dopo e ti faccio sapere se ha funzionato per me :) –

+0

Purtroppo questo non ha funzionato per me :( –

+1

+1 per SOAPAzione: "esegui" .Questo era il pezzo mancante richiesto dal mio soap server – JasonWoof

1

vostra utilizzando anche il torto Content-type, application/xml è il tipo corretto. Ma ciò non dovrebbe fare alcuna differenza per la richiesta di cURL.

4

Per coloro che trovare questo da parte di Google, mi sono imbattuto in un problema simile, cercando di interagire con un server .NET SOAP da PHP, quando il metodo ASP ha funzionato bene.

Ho usato uno sniffer di pacchetti per vedere cosa stava inviando esattamente il client ASP e ho notato che includeva i cookie dopo la richiesta di autenticazione iniziale. Così ho abilitato i cookie nel mio cURL e ha funzionato bene.

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

Dopo 2 giorni di elaborazione del motivo per cui non funzionava, è stato risolto! – Josh

3

Questo potrebbe essere vecchio, ma questo lavoro per me. Originariamente ho avuto questa funzione per un posto di XML e sapone non avrebbe funzionato fino a quando cambio la HTTPHEADER-text/xml invece di 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; 
}