Передача массивов в качестве параметров в Soap Webservice в режиме без WSDL - PullRequest
2 голосов
/ 07 марта 2011

Я использую 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?

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

просто "быстрый удар" ... Я работаю в другой среде, но изначально у меня тоже были проблемы с мыльной ценностью.Одним из решений конкретной проблемы было передать сложные массивы следующим образом:

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

"Приведение" к объекту приводит к объекту StdClass ..., который часто отлично работает для веб-сервисов.

Удачи!

0 голосов
/ 18 апреля 2011

У меня пока нет подходящего решения для этого - в настоящее время я передаю параметры клиентскому объекту в формате raw xml.Это работает, но, похоже, не лучший способ сделать это.Это мой код сейчас:

$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));
...