Необязательные параметры не являются обязательными для мыльных вызовов, использующих режим WSDL - PullRequest
2 голосов
/ 27 декабря 2010

Я пытаюсь позвонить в веб-сервис, предоставляемый 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?

1 Ответ

2 голосов
/ 07 марта 2011

Оказалось, что файл WSDL (который автоматически генерируется SAP) не имеет атрибута "minOccurs" для всех элементов, хотя конечная точка службы не требует их.Сейчас я использую Soap Client в режиме без WSDL - кажется, это самый простой способ решения моей проблемы.

...