Я пытаюсь позвонить в веб-сервис, предоставляемый SAP, чтобы обновить данные клиентов. Я использовал 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>
Веб-сервис принимает намного больше параметров, но все они являются необязательными и не нужны для этой задачи.
Теперь, если я пытаюсь сделать тот же запрос в PHP с SoapClient в режиме WSDL, я получаю ошибку для каждого необязательного параметра, который не включен в запрос, например:
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?