2010-12-27 10 views
2

Ich versuche einen von SAP bereitgestellten Webservice aufzurufen, um Kundendaten zu aktualisieren. Ich habe SoapUI zum Testen der Verbindung und der tatsächlichen Anforderung verwendet, die benötigt wird. Alles funktionierte gut, das ist, wie die SoapUI Anforderung zum Ändern einer E-Mail-Adresse wie folgt aussieht:Optionale Parameter sind nicht optional für Soap Calls im WSDL-Modus

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <urn:Ze12RfcMaintainCustomer>  
     <!--Optional:--> 
     <PiTEmail> 
      <!--Zero or more repetitions:--> 
      <item> 
       <StdNo>X</StdNo> 
       <EMail>[email protected]</EMail> 
      </item> 
     </PiTEmail> 
     <!--Optional:--> 
     <PiTEmailX> 
      <!--Zero or more repetitions:--> 
      <item> 
       <StdNo>X</StdNo> 
       <EMail>X</EMail> 
      </item> 
     </PiTEmailX> 
     <PieKunnr>4711</PieKunnr> 
     </urn:Ze12RfcMaintainCustomer> 
    </soapenv:Body> 
</soapenv:Envelope> 

Der Webservice eine ganze Menge mehr Parameter akzeptiert, aber alle von ihnen sind optional und nicht für diese Aufgabe benötigt.

Nun, wenn ich versuche, die gleiche Anforderung in PHP mit einem Soapclient in WSDL-Modus zu tun, bekomme ich einen Fehler für jeden optionalen Parameter, die nicht in der Anforderung enthalten ist, zum Beispiel:

SOAP-ERROR: Encoding: object hasn't 'EmailSrch' property 

Das ist mein Code (vereinfacht):

$params = array(
    'PieKunnr' => 4711, 
    'PiTEmail' => array(
     'item' => array(
      'StdNo' => 'X', 
      'EMail' => '[email protected]',      
     ),   
    ), 
    'PiTEmailX' => array(
     'item' => array(
      'StdNo' => 'X', 
      'EMail' => 'X',      
     ),   
    ),  
); 

$result = $service->Ze12RfcMaintainCustomer($params); 

Wenn ich alle optionalen Parameter in die Anfrage einfüge, funktioniert es.

Warum können optionale Parameter in SoapClient-Anfragen nicht weggelassen werden?

+0

Können Sie das Bit der WSDL posten, das die EmailSrch-Entität deklariert? – benjy

Antwort

2

Es stellte sich heraus, dass die WSDL-Datei (die automatisch von SAP generiert wurde) nicht das Attribut "minOccurs" für alle Elemente hatte, obwohl der Dienstendpunkt sie nicht benötigt. Ich verwende jetzt den Soap-Client im Nicht-WSDL-Modus - dies scheint die einfachste Problemumgehung für mein Problem zu sein.