2012-06-14 2 views
0

Я довольно новичок в мире SOAP и WSDL. Что мне нужно сделать, чтобы убедиться, что пространство имен всегда будет в элементе return-element?Как добавить пространство имен ко всем возвращаемым элементам WSDL/SOAP

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://someurl.com"> 
    <SOAP-ENV:Body> 
     <ns1:sayHelloResponse> 
      <return>Say Hello Kelvin</return> 
     </ns1:sayHelloResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Что я хочу:

<ns1:sayHelloResponse> 
    <ns1:return>Say Hello Kelvin</ns1:return> 
</ns1:sayHelloResponse> 

Я использую PHP и Zend Framework. WSDL генерируется Zend_Soap_AutoDiscovery. Это не должно быть барьером, потому что я все равно изменю его вывод.

Благодарим за помощь.

ответ

1

После некоторого перерыва я снова обратился к проблеме. На этот раз я наткнулся на этот хороший article (кредиты моему бывшему сотруднику Майку). Если атрибут elementFormDefault не объявлен в теге схемы, считается неквалифицированным как его значение. Дав ему значение «квалифицированное» произойдет следующее:

Но если добавить elementFormDefault = «квалифицированный» для всех схем в документе/буквальных завернутых WSDL, то все элементы в сообщениях будут квалифицированы с пространством имён своих родителей.

В общем, вы не хотите использовать elementFormDefault = «квалифицированный» , потому что раздувает сообщения, но через год или более назад были проблем взаимодействия между различными поставщиками, и установкой этого атрибута иногда исправила проблемы.

Несмотря на то, что я не использовал документ/литерал, я хотел попробовать. Я добавил атрибут в свой тег схемы и сделал запрос на другой вызов. Вот ответ, который я получил:

<ns1:getUserResponse> 
    <return> 
     <ns1:firstname>First</ns1:firstname> 
     <ns1:lastname>Last</ns1:lastname> 
    </return> 
    </ns1:getUserResponse> 

Как вы можете видеть, дочерние элементы «возвращения» -элементное получил пространство имен с префиксом. На данный момент я очень волновался, потому что, наконец, я приблизился к тому месту, где хотел. К сожалению, элемент возврата не имел префикса пространства имен. Я попробовал предыдущий вызов (см. Вопрос), но ответ был таким же, как и раньше.

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

class Custom_Soap_Server extends Zend_Soap_Server 
{ 
    public function __construct($wsdl = null, array $options = null) 
    { 
     parent::__construct($wsdl, $options); 

     // Response of handle will always be returned 
     $this->setReturnResponse(true); 
    } 

    public function handle($request = null) 
    { 
     $response = parent::handle($request); 
     echo str_replace(array('<return>', '</return>'), array('<ns1:return>', '</ns1:return>'), $response); 
     return; 
    } 
} 

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

После использования нового пользовательского класса вместо Zend_Soap_Server все элементы возврата имели ns1, префиксный для них.

+0

Испытывали ли вы, что измененный отклик SOAP отключен. Например, ' '. Я предполагаю, что это имеет какое-то отношение к добавлению символов в ответ SOAP через метод str_replace. Где задана длина ответа SOAP? – f7n