Я использую Zend_Soap_Client для запроса данных из веб-сервиса, предоставляемого SAP. Поскольку у автоматически сгенерированного файла WSDL есть несколько недостатков, я использую не-WSDL-режим клиента.
Мне удалось успешно вызвать веб-сервис, который требует только простых параметров, таких как строки. Пример:
Вот что ожидает SAP:
<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:Ze12RfcGetCustHistoryNew>
<PiDateHigh>2011-12-31</PiDateHigh>
<PiDateLow>1970-01-01</PiDateLow>
<PiKunnr>1</PiKunnr>
</urn:Ze12RfcGetCustHistoryNew>
</soapenv:Body>
</soapenv:Envelope>
Это мой (рабочий) код на PHP (с $ soapClient, уже инициализированным в режиме без WSDL):
$soapClient->Ze12RfcGetCustHistoryNew(
new SoapParam(date('Y-m-d'), 'PiDateHigh'),
new SoapParam('1970-01-01', 'PiDateLow'),
new SoapParam('1', 'PiKunnr')
);
Но как только мне нужно передать услугу более сложные параметры, она не работает. Опять пример:
Это то, что ожидает SAP:
<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:Ze12RfcGetCustHistoryNew>
<PiDateHigh>2011-12-31</PiDateHigh>
<PiDateLow>1970-01-01</PiDateLow>
<PiKunnr>1</PiKunnr>
<PiTBelegart>
<item>
<BelegartTyp>FAKTURA</BelegartTyp>
<Belegart>ZF2</Belegart>
</item>
</PiTBelegart>
</urn:Ze12RfcGetCustHistoryNew>
</soapenv:Body>
</soapenv:Envelope>
Я пытался использовать многомерный массив, содержащий SoapParams, но это не сработало. В режиме WSDL я мог бы передавать параметры в виде массива без необходимости использования SoapParams. Как я могу сделать это в режиме без WSDL?