Почему веб-служба возвращает данные, даже если IP-адрес в wsdl неверен?

Существует файл PHP действующий как wsdl , и есть файл 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-адрес компьютера, на котором находится wsdl и wsdl находится 192.168.1.123, и я получаю данные при вызове функции из wsdl PHP ! Так что <soap:address не нужен?

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

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

 <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-адрес, где можно подключиться к развернутому веб-сервису. Адрес есть как подсказка для инструментов, чтобы добавить некоторую конфигурацию по умолчанию, которую вы позже замените REAL-адресом для вызовов.

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