Rene: SOAP-Request mit curl

Hi, für den Online-Shop eines Kunden soll ich eine Bonitätsprüfung per Webservice einbinden. Mit dem Tool soapUI funktionieren die Abfragen schon ganz gut, ich erhalte eine Antwort in XML.
Die Bonitätsprüfung im Online-Shop soll per PHP eingebunden werden. Die Abfragen werden mittels curl durchgeführt. Nur bekomme ich immer einen Fehler 400 ausgegeben, was laut Webservice-Doku "INVALID_REQUEST - Faulty enquiry. One or more Elements are faulty." bedeutet, also eine fehlerhafte Abfrage.
Ich habe den XML-Code für die Abfrage aus soapUI 1 zu 1 kopiert und in der Variablen $body gespeichert.

$body = '<?xml version="1.0" encoding="utf-8"?>  
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v001="http://www.deltavista.com/dspone/ordercheck-if/V001">  
   <soapenv:Header>  
...  
   </soapenv:Header>  
   <soapenv:Body>  
...  
   </soapenv:Body>  
</soapenv:Envelope>';

Den Header habe ich ebenfalls aus soapUI kopiert, nur den User-Agent habe ich angepasst.

$headers = array("POST https://dspone.deltavista.com/dspone/services/OrderCheckService HTTP/1.1\n",  
"Accept-Encoding: gzip,deflate\n",  
"Content-Type: text/xml;charset=UTF-8\n",  
"SOAPAction: \"urn:orderCheck\"\n",  
"User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\n",  
"Host: dspone.deltavista.com\n");

Und danach folgen die curl-Anweisungen

//Die Session initialisieren  
$ch = curl_init();  
  
//Session Optionen setzen  
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
curl_setopt($ch, CURLOPT_URL, "https://dspone.deltavista.com/dspone/services/OrderCheckService");  
curl_setopt($ch, CURLOPT_HEADER, TRUE);  
curl_setopt($ch, CURLOPT_POST, TRUE);  
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
echo $code;  
//Session beenden  
curl_close($ch);  

Und jetzt komme ich nicht mehr weiter. Am XML-Code für die Abfrage kann es doch eigentlich nicht liegen, oder? Bleiben also nur die curl-Anweisungen. Ich habe etliche Optionen (siehe php.net) ausprobiert, aber leider keinen Erfolg gehabt. Hab ich vielleicht was grundsätzliches übersehen oder nicht verstanden? Ist nämlich mein erster Webservice, den ich einbinde.

  1. Hallo Rene,

    mache Dich bitte mit den Grundlagen Deines Handelns vertraut: RFC 2616

    Nur bekomme ich immer einen Fehler 400 ausgegeben, was laut Webservice-Doku "INVALID_REQUEST - Faulty enquiry. One or more Elements are faulty." bedeutet, also eine fehlerhafte Abfrage.

    Dein Posting macht auf mich den Eindruck, als hättest Du keine Ahnung von dem, was Du eigentlich machen möchtest und von dem was Du anstatt dafür machst. Sieh Dir den Request, den Dein PHP-Client sendet, doch mal an!

    POST / HTTP/1.1
       Accept: */*
       POST https://dspone.deltavista.com/dspone/services/OrderCheckService HTTP/1.1

    Accept-Encoding: gzip,deflate

    Content-Type: text/xml;charset=UTF-8

    SOAPAction: "urn:orderCheck"

    Host: dspone.deltavista.com

    Content-Length: 286

    <?xml version="1.0" encoding="utf-8"?>
       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v001="http://www.deltavista.com/dspone/ordercheck-if/V001">
          soapenv:Header
       ...
          </soapenv:Header>
          soapenv:Body
       ...
          </soapenv:Body>
       </soapenv:Envelope>

    Also, und ohne auf die Fehler im einzelnen einzugehen:

    $headers=array(  
       "Accept-Encoding: gzip,deflate",  
       "Content-Type: text/xml;charset=UTF-8",  
       "SOAPAction: \"urn:orderCheck\"");
    

    Gruß aus Berlin!
    eddi

    --
    Könnte bitte jemand mal langsam dafür sorgen, dass da draußen nicht dauernd die Filmrolle "Planet der Affen" abgedudelt wird? Danke!
    1. Hi, danke für den Denkanstoss. Durch deinen Hinweis kam ich einen Schritt weiter. Daraufhin bekam ich einen AUTHENTICATION_ERROR vom Webservice. Um die Fehlerursache zu finden, habe ich wieder einen halben Tag verplempert.

      So sieht der funktionierende Code jetzt aus, fehlt noch die Fehlerbehandlung und die Auswertung des Response mit SimpleXML

      $body = "XML-Code";  
        
      $headers = array(  
      "Content-Type: text/xml;charset=UTF-8",  
      "SOAPAction: \"urn:orderCheck\"");  
        
      //Die Session initialisieren  
      $ch = curl_init();  
        
      //Session Optionen setzen  
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
      curl_setopt($ch, CURLOPT_URL, "https://dspone.deltavista.com/dspone/services/OrderCheckService");  
        
      //SSL Settings  
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);  
        
      curl_setopt($ch, CURLOPT_POSTFIELDS, $body);  
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // das Deaktivieren dieser Option hat mir bei der Suche auch geholfen!  
        
      //Ausführen der Aktionen  
      curl_exec($ch);  
        
      //Session beenden  
      curl_close($ch);  
      
      
      1. Re:

        ...bekam ich einen AUTHENTICATION_ERROR vom Webservice. Um die Fehlerursache zu finden, habe ich wieder einen halben Tag verplempert.

        Anhand dieses Beispielcodes habe ich eine HTTP-Anfrage gestellt. Der Server Antwortet mit Status 500. Da auch curl_getinfo() oder curl_error() keine vergleichbaren Fehler ausgeben, solltest Du für Dich klären, was also ein "AUTHENTICATION_ERROR" ist! Hier hast Du soweit alle Hilfestellungen bekommen, die die technische Umsetzung betreffen. Alles andere an Informationen, Aufklärungen und Hilfe kann dieses Forum nicht leisten. Wende Dich, um weitere Zeit nicht zu verplempern, an den Dienstanbieter dieser "vierten Sicht"!

        Gruß aus Berlin!
        eddi

        --
        Könnte bitte jemand mal langsam dafür sorgen, dass da draußen nicht dauernd die Filmrolle "Planet der Affen" abgedudelt wird? Danke!