开发者

Passing Arrays as Parameters to Soap Webservice in non-WSDL mode

I am using Zend_Soap_Client to query data from a webservice provided by SAP. Since the auto-generated WSDL file has a few flaws, I use the non-WSDL mode of the client.

I managed to successfully call a webservice which only requires simple parameters, like strings. Example:

This is what SAP expects:

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

This is my (working) code in PHP (with $soapClient already initialized in non-WSDL mode):

$soapClient->Ze12RfcGetCustHistoryNew(
  new SoapParam(date('Y-m-d'), 'PiDateHigh'),
  new SoapParam('1970-01-01', 'PiDateLow'),
  new SoapParam('1', 'PiKunnr')
);

But as soon as I have to pass more complex parameters to the service, it does not work. Again, an example:

This is what SAP expects:

<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</Bele开发者_Python百科gartTyp>
          <Belegart>ZF2</Belegart>
        </item>
      </PiTBelegart>
    </urn:Ze12RfcGetCustHistoryNew>
  </soapenv:Body>
</soapenv:Envelope>

I have tried to use a multi-dimensional array containing SoapParams, but that did not work. In WSDL mode, I could pass the params as an array, without the need of using SoapParams. How can I do this in non-WSDL mode?


just a "quick-hit" ... I'm working in a different environment, but initially had my soap-value troubles too. One solution for a particular problem was to pass complex arrays this way:

$data = (object)$complexArray;
$result = $webserviceClient->getResult($data);

"Casting" to object results in a StdClass object ... which often works fine for webservices.

Good Luck!


I have not come up with a nice solution for this yet - currently I pass the parameters to the client object as raw xml. That works, but does not seem to be the best way to do this. This is my code now:

$params = '
  <PiDateHigh>2011-12-31</PiDateHigh>
  <PiDateLow>1970-01-01</PiDateLow>
  <PiKunnr>1</PiKunnr>
  <PiTBelegart>
    <item>
      <BelegartTyp>FAKTURA</BelegartTyp>
      <Belegart>ZF2</Belegart>
    </item>
  </PiTBelegart>
  ';

$result = $this->_client->Ze12RfcGetCustHistoryNew(new SoapVar($params,XSD_ANYXML));
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜