Solicitud SOAP en PHP con CURL

3 minutos de lectura

Solicitud SOAP en PHP con CURL
Iladarsda

Dado que el manual SOAP en php.net no es muy amigable para los novatos y no pude encontrar ningún buen ejemplo, publicaré mi pregunta aquí.

¿Cómo puedo crear una solicitud PHP SOAP para que se vea así?

POST /MySERVER/myWSDLservice.asmx HTTP/1.1
Host: connection.mywebsite.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://connection.mywebsite.com/MySERVER/GetCarType"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <GetCarType xmlns="http://connection.mywebsite.com/MySERVER/">
    <IDNumber>string</IDNumber>
  </GetCarType>
 </soap:Body>
</soap:Envelope>

Tenga en cuenta:

  • hay autenticación de usuario/contraseña
  • conexión SSL

Cualquier sugerencia / enlaces / ejemplo muy apreciada.

Solicitud SOAP en PHP con CURL
Iladarsda

Probado y funcionando!

  • con https, usuario y contraseña

     <?php 
     //Data, connection, auth
     $dataFromTheForm = $_POST['fieldName']; // request data from the form
     $soapUrl = "https://connecting.website.com/soap.asmx?op=DoSomething"; // asmx URL of WSDL
     $soapUser = "username";  //  username
     $soapPassword = "password"; // password
    
     // xml post structure
    
     $xml_post_string = '<?xml version="1.0" encoding="utf-8"?>
                         <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                           <soap:Body>
                             <GetItemPrice xmlns="http://connecting.website.com/WSDL_Service"> // xmlns value to be set to your WSDL URL
                               <PRICE>'.$dataFromTheForm.'</PRICE> 
                             </GetItemPrice >
                           </soap:Body>
                         </soap:Envelope>';   // data from the form, e.g. some ID number
    
        $headers = array(
                     "Content-type: text/xml;charset=\"utf-8\"",
                     "Accept: text/xml",
                     "Cache-Control: no-cache",
                     "Pragma: no-cache",
                     "SOAPAction: http://connecting.website.com/WSDL_Service/GetPrice", 
                     "Content-length: ".strlen($xml_post_string),
                 ); //SOAPAction: your op URL
    
         $url = $soapUrl;
    
         // PHP cURL  for https connection with auth
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($ch, CURLOPT_USERPWD, $soapUser.":".$soapPassword); // username and password - declared at the top of the doc
         curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
         curl_setopt($ch, CURLOPT_TIMEOUT, 10);
         curl_setopt($ch, CURLOPT_POST, true);
         curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
         // converting
         $response = curl_exec($ch); 
         curl_close($ch);
    
         // converting
         $response1 = str_replace("<soap:Body>","",$response);
         $response2 = str_replace("</soap:Body>","",$response1);
    
         // convertingc to XML
         $parser = simplexml_load_string($response2);
         // user $parser to get your data out of XML response and to display it. 
     ?>
    

  • El script funciona muy bien y devuelve la respuesta XML SOAP pastebin.com/9wzUV8Pw pero no puedo analizar la respuesta en una cadena. ¿Alguna idea?

    – Irfan

    14 de agosto de 2013 a las 11:39


  • Sin probarlo, simplexml_load_string() no puede manejar el “:”, ¿verdad?

    – dondeismydipp

    21 de agosto de 2013 a las 8:50

  • Estoy tratando de consumir un servicio web SOAP usando curl, pero solo recibo un error que dice “Tipo de medio no admitido”. ¿Hay alguna manera de forzar el encabezado de tipo de contenido? Cuando configuro CURLOPT_POSTFIELDS, el tipo de contenido cambia a “aplicación/x-www-form-urlencoded”.

    – Gustavo Straube

    26/03/2014 a las 20:46

  • Encontré el problema aquí! Estoy escribiendo los encabezados usando una matriz asociativa. Solo noté eso cuando leí esta respuesta: stackoverflow.com/a/11091261/1128918

    – Gustavo Straube

    26 de marzo de 2014 a las 21:14

  • Esto, a partir de febrero de 2017, todavía funciona según lo previsto y ayuda a las personas cuando tienen dolor de cabeza mientras trabajan con SOAP. Solo me gustaría señalar el hecho de que, algunos servidores, requieren un prefijo (como <clin:price>) para las etiquetas xml (puede ver eso cuando la respuesta contiene un mensaje sobre un subelemento no identificado)

    –Erenor Paz

    20 de febrero de 2017 a las 15:35

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad