Почему веб-сервис возвращает данные, даже если IP-адрес в wsdl неверен? - PullRequest
3 голосов
/ 03 апреля 2012

Существует файл PHP, действующий как webservice, и есть файл wsdl, в котором есть следующие строки:

<service name="ClientService">
    <documentation></documentation>
    <!-- partie 8 : Port -->
        <port name="ClientPort" binding="typens:ClientBinding">
            <soap:address location="http://192.168.1.12/imfmobile/webservice/InterfaceTransfererClient.php"/>
        </port>
</service>

Проблема заключается в том, что IP-адрескомпьютер, на котором находятся webservice и wsdl, - 192.168.1.123, и я получаю данные при вызове функции из веб-службы PHP!Так что тег <soap:address не нужен?

1 Ответ

4 голосов
/ 05 апреля 2012

Краткий ответ: Адрес является лишь указанием (для разработчиков или инструментов, которые генерируют код и конфигурацию) того, где может быть доступна служба и какой URL-адрес следует ожидать.

Длинный ответ: Если вы посмотрите на схему WSDL , вы увидите, что элемент port определен как содержащий только атрибуты name и binding, так что этого будет достаточно. Ваш сервисный элемент может выглядеть так, и это будет технически правильно:

<service name="ClientService">
   <port name="ClientPort" binding="typens:ClientBinding" />
</service>

Но port также определяется как расширяемый элемент, который позволяет добавлять в него элементы из других пространств имен (например, <soap:address>).

Обычно (да!) <soap:address> должен указывать, где выставлен реальный сервис, но, к сожалению, это не всегда происходит из-за различных факторов, таких как:

  • некоторые адреса серверов были изменены, и люди забыли обновить файл WSDL (для сначала контракт создал WSDL);
  • WSDL автоматически генерируется каркасом ( контракт последний ), и каркас не может знать, по какому внешнему адресу выставляется веб-служба, поэтому он добавляет некоторый адрес по умолчанию с чем-то, что он знает (например, локальный IP или имя машины);
  • у вас есть центральный WSDL, который описывает 3 идентичных развернутых сервиса (один в DEV, один в UAT и один в PROD), и вы не можете добавить адрес для всех 3 из них;
  • и т. Д.

WSDL в основном используются для генерации клиентского кода. После этого вам больше не нужен WSDL, вам просто нужен URL-адрес для подключения к развернутому веб-сервису. Этот адрес служит подсказкой для инструментов для добавления некоторой конфигурации по умолчанию, которую вы позже замените РЕАЛЬНЫМ адресом для вызовов.

В идеале, то, что в WSDL, должно совпадать с реальным адресом, но это некоторая информация, которая обычно выпадает из-за задач по обслуживанию, и вещи в конечном итоге устаревают. Вы должны указать один как подсказку, даже если это просто <soap:address location="http://localhost/imfmobile/webservice/InterfaceTransfererClient.php"/>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...