我尝试调用 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>
Web 服务接受更多参数,但所有这些参数都是可选的,并且对于此任务不需要。
现在,如果我尝试在 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 请求中不能省略可选参数?