SOAP-Anfrage in PHP mit CURL

70

Da das SOAP-Handbuch auf php.net nicht sehr noob-freundlich ist und ich keine guten Beispiele finden konnte, werde ich meine Frage hier posten.

Wie kann ich eine PHP-SOAP-Anfrage erstellen, um so auszusehen?

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>

Bitte beachten Sie:

  • Es gibt User / Pass Auth
  • SSL-Verbindung

Jeder Vorschlag / Links / Beispiel sehr geschätzt.

Iladarsda
quelle

Antworten:

170

Getestet und funktioniert!

  • mit https, Benutzer & Passwort

     <?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. 
     ?>
    
Iladarsda
quelle
1
Das Skript funktioniert hervorragend und gibt die XML-SOAP-Antwort pastebin.com/9wzUV8Pw zurück, aber ich kann die Antwort nicht in eine Zeichenfolge zerlegen. Irgendeine Idee?
Irfan
Ohne es zu testen, kann simplexml_load_string () das ":" nicht verarbeiten, oder?
Whereismydipp
Ich versuche, einen SOAP-Webservice mit Curl zu verwenden, erhalte jedoch nur die Fehlermeldung "Nicht unterstützter Medientyp". Gibt es eine Möglichkeit, den Content-Type-Header zu erzwingen? Wenn ich CURLOPT_POSTFIELDS setze, ändert sich der Inhaltstyp in "application / x-www-form-urlencoded".
Gustavo Straube
1
Ich habe das Problem hier gefunden! Ich schreibe die Header mit einem assoziativen Array. Ich habe nur bemerkt, dass beim Lesen dieser Antwort: stackoverflow.com/a/11091261/1128918
Gustavo Straube
Dies funktioniert ab Februar 2017 immer noch wie vorgesehen und hilft Menschen, wenn sie während der Arbeit mit SOAP Kopfschmerzen haben. Ich möchte nur darauf hinweisen, dass einige Server ein Präfix (wie <clin:price>) für die XML-Tags benötigen (das können Sie sehen, wenn die Antwort eine Nachricht über ein nicht identifiziertes
Unterelement