PHP SoapServer и сложные типы

#php #soap #xsd #wsdl #soapserver

#php #soap #xsd #wsdl #soapserver

Вопрос:

Я работаю над созданием веб-сервиса на PHP с использованием класса SoapServer, но я столкнулся с проблемой приведения сложных типов.

WSDL полностью корректен, и PHP SoapClient обрабатывает его безупречно, но, похоже, существует проблема со сложными типами, которые возвращаются, не будучи приведенными должным образом. Это обнаружилось при использовании сервиса в .Net, поскольку я получал исключения, которые указывали, что тип отсутствует в данном пространстве имен.

Я множество раз искажал свою функцию, меняя пространство имен в элементе, но.Net продолжает выдавать мне ошибки, независимо от того, какое пространство имен я использую.

Рассмотрим следующую аббревиатуру скрипта:

 function getCommands() {
    $output = array();
    // ...
    foreach($result as $row) {
        $output[] = new SoapVar($row, SOAP_ENC_OBJECT, 'ns1:command');
    }

    return $output;
}
  

Сокращенный ответ:

 <?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="urn:MyWebService"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:getCommandsResponse>
      <return SOAP-ENC:arrayType="ns1:command[12]" xsi:type="ns1:ArrayOfCommand">
        <item xsi:type="ns1:command">
            <!-- ... -->
        </item>
      <!-- ... -->
      </return>
    </ns1:getCommandsResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  

Что я заметил, так это то, что xmlns:ns1 определяется посредством WSDL, и оно соответствует пространству имен в WSDL. Однако клиент .Net SOAP, похоже, не понимает, что там определен command элемент. Тем не менее, он понимает, что именно там ArrayOfCommand определено.

Итак, мой вопрос состоит из нескольких частей:

  1. Это известная ошибка с SoapServer?
  2. Если нет, не упускаю ли я чего-то серьезного в своем WSDL?
  3. Я неправильно кодирую свои объекты?
  4. Это проблема с .Net? Если да, то каков обходной путь?

Ответ №1:

Я смог решить эту проблему, снова поработав над <types/> разделом моего WSDL, используя Google WSDL для справки. Затем мне пришлось немного поколдовать в моей PHP-функции, приведя элементы $command , соответствующие их соответствующим типам в WSDL, и закодировав всю команду как ns2:command . При согласовании с WSDL все это прекрасно сочеталось и .У Net с этим нет никаких трудностей.

Я удивлен, что никто в сообществе разработчиков не пожелал ответить на этот вопрос, но я надеюсь, что кто-нибудь сможет извлечь из этого хотя бы какое-то направление о том, как исправить свой собственный случай этой проблемы.