После некоторого перерыва я снова обратился к проблеме. На этот раз я наткнулся на этот хороший 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, префиксный для них.
Испытывали ли вы, что измененный отклик SOAP отключен. Например, ' '. Я предполагаю, что это имеет какое-то отношение к добавлению символов в ответ SOAP через метод str_replace. Где задана длина ответа SOAP? –
f7n