对于使用WSDL模式的Soap调用,可选参数不是可选的

时间:2010-12-27 10:38:44

标签: php soap sap webservice-client

我尝试调用SAP提供的Web服务来更新客户数据。我使用SoapUI来测试连接和所需的实际请求。一切正常,这就是SoapUI请求更改电子邮件地址的方式:

<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>me@example.com</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>

webservice接受了更多参数,但所有参数都是可选的,不需要此任务。

现在,如果我尝试在WSDL模式下使用SoapClient在PHP中执行相同的请求,则会为请求中未包含的每个可选参数收到错误,例如:

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

这是我的代码(简化):

$params = array(
    'PieKunnr' => 4711,
    'PiTEmail' => array(
        'item' => array(
            'StdNo' => 'X',
            'EMail' => 'me@example.com',                    
        ),        
    ),
    'PiTEmailX' => array(
        'item' => array(
            'StdNo' => 'X',
            'EMail' => 'X',                    
        ),        
    ),    
);

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

如果我将所有可选参数放入请求中,它就可以工作。

为什么SoapClient请求中不能省略可选参数?

1 个答案:

答案 0 :(得分:2)

事实证明,WSDL文件(由SAP自动生成)没有“minOccurs”属性来表示元素,尽管服务端点不需要它们。我现在在非WSDL模式下使用Soap Client - 这似乎是我的问题最简单的解决方法。