2010-06-09 52 views
33

Esto me ha estado molestando por días; Intento enviar una publicación de SOAP a través de Curl, pero sigo recibiendo el error "No se pudo conectar con el host", pero realmente no veo cómo.¿Cómo puedo enviar SOAP XML a través de Curl y PHP?

Tengo una versión ASP que funciona bien con la misma URL y datos. Creo que es solo una cosa PHP/Curl.

que actualmente tiene el siguiente código (los datos CURLOPT_POSTFIELDS es una cadena válida sobre SOAP):

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

Así que cualquier idea por qué sólo errores todo el tiempo?

¡La versión ASP funciona bien! El código es:

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

Respuesta

35

Gracias amigo, tu código me ha funcionado.

Aquí está el código:

$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

Nunca obtuve una respuesta que funcionó para mí, y esto fue hace más de 2 años. La gente parece encontrar útil esta respuesta, así que la marcaré como la respuesta. Gracias. –

+0

¿Alguien puede ayudarme con el vicio? al revés de esto es decir ¿Activar la solicitud curl como arriba para una solicitud soapclient? – mahen3d

2

Intenta configurar el número de puerto con CURLOPT_PORT ya que quizás no le guste como parte de la URL?

+0

bastante bueno en que uno y que no funciona:/Gracias a la idea de que –

11

tuve que usar

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

y

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

Gracias Dom, le daré una oportunidad más adelante y te dejaré saber si me funcionó :) –

+0

Lamentablemente esto no funcionó para mí :( –

+1

+1 para SOAPAction: "ejecutar". Esa era la pieza faltante requerida por mi servidor de jabón. – JasonWoof

1

Tu también utilizando el mal de tipo de contenido, application/xml es del tipo correcto. Pero eso no debería hacer ninguna diferencia en la solicitud de cURL.

4

Para aquellos encontrar esto desde Google, me encontré con un problema similar, tratando de interactuar con un servidor SOAP .NET PHP, ASP cuando el método funcionaba bien.

Utilicé un sniffer de paquetes para ver exactamente qué estaba enviando el cliente ASP, y noté que incluía cookies después de la solicitud de autenticación inicial. Así que habilité las cookies en mi cURL y funcionó bien.

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

Después de 2 días de averiguar por qué no funcionaba, ¡esto lo solucionó! – Josh

3

Esto puede ser viejo, pero esto funciona para mí. Al principio tuve esta función para un puesto XML y SOAP No trabajaría hasta que cambie la HTTPHEADER-text/xml en lugar 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; 
} 
Cuestiones relacionadas