PHP SoapServer и сложные типы - PullRequest
2 голосов
/ 14 мая 2011

Я работаю над созданием веб-службы на 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. Однако SOAP-клиент .Net, похоже, не понимает, что здесь определен элемент command. Однако он понимает, что именно здесь определяется ArrayOfCommand.

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

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

1 Ответ

1 голос
/ 20 мая 2011

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

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

...