Rene: Namespaces im SOAP-Server und Auswertung

Hi,
für einen Kunden wollen wir einen Webservice einrichten. Der Kunde schickt uns Daten im folgenden Format:

<?xml version="1.0" encoding="UTF-8"?>  
<OTA_HotelInvCountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2009-10-14T17:17:45" Target="Production" Version="1">  
 <POS>  
  <Source AgentDutyCode="agentdutycode" AgentSine="agentsine">  
   <RequestorID ID="199976"/>  
  </Source>  
 </POS>  
 <Inventories>  
  <Inventory>  
   <StatusApplicationControl Start="2009-10-14" End="2009-11-10" InvTypeCode="140759" />  
   <InvCounts><InvCount Count="60" CountType="1" /></InvCounts>  
  </Inventory>  
  <Inventory>  
   <StatusApplicationControl Start="2009-11-10" End="2009-11-11" InvTypeCode="140759" />  
   <InvCounts><InvCount Count="0" CountType="1" /></InvCounts>  
  </Inventory>  
 </Inventories>  
</OTA_HotelInvCountNotifRQ>

Wie man erkennen kann, wird ein eigener Namespace "http://www.opentravel.org/OTA/2003/05" verwendet.

Der Server sieht derzeit nur so aus:

<?php  
function OTA_HotelInvCountNotifRQ($test) {  
   return $test;  
}  
$server = new SoapServer(NULL, array('uri' => "http://www.opentravel.org/OTA/2003/05"));  
$server->addFunction('OTA_HotelInvCountNotifRQ');  
$server->handle();  
?>

Der XML-Code wird mittels curl an den Server gesendet:

  
...  
$result = curl_exec($ch);  
if($result === false){  
   echo '<p>Fehler: '.curl_error($ch);  
} else {  
   echo '<p>Ergebnis:'. $result;  
}

Ausgegeben wird folgender Fehler:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:VersionMismatch</faultcode><faultstring>Wrong Version</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

Der curl-Request an sich funktioniert demnach. Nur scheinen Client und Server im Namespace nicht übereinzustimmen. Was muss ich im Server-Skript angeben, damit es keinen Versions-Konflikt mehr gibt? Oder bin ich komplett auf der falschen Fährte?

Und wie kann ich den Request mit der Funktion OTA_HotelInvCountNotifRQ auswerten? Ich benötige z. B. auch die Angabe "RequestorID".

  1. Hi,

    für einen Kunden wollen wir einen Webservice einrichten. Der Kunde schickt uns Daten im folgenden Format:

    <?xml version="1.0" encoding="UTF-8"?>

    <OTA_HotelInvCountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2009-10-14T17:17:45" Target="Production" Version="1">

    [...]

    </OTA_HotelInvCountNotifRQ>

      
    Schickt der Kunde wirklich nur das? So ganz ohne Soap-Envelope usw.?  
      
    
    > $server = new SoapServer(NULL, array('uri' => "http://www.opentravel.org/OTA/2003/05"));  
      
    Ein Soap-Server möchte auch Soap-Daten erhalten (also soap-Envelope usw.)  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
    
    
    1. »»» Schickt der Kunde wirklich nur das? So ganz ohne Soap-Envelope usw.?

      Zumindest hat er uns den XML-Code als Beispiel in einem Mail-Anhang zugeschickt.

    2. Hi, dank deiner Frage habe ich nochmal weiter rumprobiert. Ich bin bisher davon ausgegangen, dass der Kunde uns die Daten im korrekten Format sendet, da ich sehr wenig Erfahrung mit Webservices habe.

      Folgende Erkenntnisse habe ich erlangt:

      Wird ein Request im folgenden Format gesendet:

      <OTA_HotelInvCountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2009-10-14T17:17:45" Target="Production" Version="1">  
      <POS>  
      <Source AgentDutyCode="agentdutycode" AgentSine="agentsine"><RequestorID ID="199976"/></Source>  
      </POS>  
      <Inventories>  
       <Inventory>  
       <StatusApplicationControl Start="2010-04-14" End="2010-05-10" InvTypeCode="140759" />  
       <InvCounts><InvCount Count="60" CountType="1" /></InvCounts>  
       </Inventory>  
       <Inventory>  
       <StatusApplicationControl Start="2010-11-10" End="2010-11-11" InvTypeCode="140759" />  
       <InvCounts><InvCount Count="0" CountType="1" /></InvCounts>  
       </Inventory>  
      </Inventories>  
      </OTA_HotelInvCountNotifRQ>
      

      erhalte ich eine Fehlermeldung "Version Mismatch".

      Wird ein Request aber mit Envelope gesendet:

      <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">  
      <soap:Header></soap:Header>  
      <soap:Body>  
      <OTA_HotelInvCountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2009-10-14T17:17:45" Target="Production" Version="1">  
      ...  
      </OTA_HotelInvCountNotifRQ>  
      </soap:Body>  
      </soap:Envelope>
      

      funktioniert der Webservice wunderbar.

      Bevor ich dem Kunden jetzt mitteile, dass er doch bitte seinen Request ändern soll, habe ich noch ein paar Verständnisfragen.

      Ist es irgendwie anders möglich den Request ohne Envelope zu verwenden, so dass der Kunde seinen Request nicht ändern muss? Gibt es vielleicht eine Möglichkeit den Server entsprechend einzustellen? Oder gibt es vielleicht eine andere Technologie? XML-RPC vielleicht (hab ich nebenbei von gelesen)?

      Mein Server sieht wie folgt aus:

      <?php  
      // Fehlermeldungen anzeigen  
      error_reporting(E_ALL);  
        
      // Hauptklasse  
      require("class/VacData.class.php");  
        
      $vac = new VacData;  
        
      // DB-Verbindung herstellen  
      require($vac->htdocs."/db/opendb.inc.php");  
        
      try{  
         $server = new SoapServer(NULL, array(  
         "uri" => "http://www.opentravel.org/OTA/2003/05",  
         "location" => "http://www.url.de/webservices/server.php5"));  
         //$server->addFunction('OTA_HotelInvCountNotifRQ');  
         $server->setClass("VacData");  
         $server->handle();  
      }  
      catch (SOAPFault $f) {  
        print $f->faultstring;  
      }  
      ?>