Search code examples
phpsoapwebservice-clientsap-basis

Optional Parameters not optional for Soap Calls using WSDL mode


I try to call a webservice provided by SAP to update customer data. I used SoapUI for testing the connection and the actual request that is needed. Everything worked fine, this is how the SoapUI request for changing an email address looks like:

<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>

The webservice accepts a whole lot more parameters, but all of them are optional and not needed for this task.

Now if I try to do the same request in PHP with a SoapClient in WSDL mode, I get an error for every optional parameter that is not included in the request, e.g.:

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

This is my code (simplified):

$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);

If I put all the optional parameters into the request, it works.

Why can optional parameters not be omitted in SoapClient requests?


Solution

  • It turned out that the WSDL file (which is automatically generated by SAP) did not have the "minOccurs" attribute for alle the elements, although the service endpoint does not require them. I am now using the Soap Client in non-WSDL mode - this seems to be the easiest workaround for my problem.