Описание типов данных для wsdl во внешнем файле

Здесь я покажу пример описания типов во внешнем файле и подключении этого файла в wsdl-описании вашего веб-сервиса.
Когда у вас относительно немного методов выставленных для веб-сервиса и нет каких-либо сложных custom структур-типов данных, то описание этих самых типов можно реализовать прямо в основном wsdl файле. Когда же количество методов с нестардантными параметрами уже значительно, то для удобства описание типов данных можно вынести во внешний файл.
Обратите внимание, что этот импортируемый файл должен быть полноценным xml файлом – с блоком

<?xml version="1.0" encoding="UTF-8"?>

в начале документа.
Дальше структура примерно следующая:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:webservice.contentinn.com" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:yournamespace">
  <xsd:complexType name="AuthHeader">
    <xsd:sequence>
      <xsd:element name="company" type="xsd:string"/>
      <xsd:element name="username" type="xsd:string"/>
      <xsd:element name="password" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="AuthHeaderElement" type="tns:AuthHeader"/>
  ...........

Так как wsdl файл по сути своей та же схема, то подключение одного файла в другой выполняется обычным для xsd-файлов методом:

<import namespace="YOURNAMESPACE" schemaLocation="RELATIVE_PATH_TO_YOUR_SCHEMA_FILE"/>

Файл описания типов данных необходимо подключать в блоке :

<wsdl:types xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema">
      <import namespace="urn:yournamespace" schemaLocation="wsdlTypes.xsd"/>
    </xsd:schema>
</wsdl:types>

У меня лично на первых порах некоторые сложности вызвало подключение файла с описанием типов данных в основной wsdl файл. Особое внимание в этом случае необходимо уделить namespace’ам (аттрибут namespace тэга import). А именно, чтобы значение аттрибута namespace точно соответствовало аттрибуту targetNamespace в подключенном файле схемы. В нашем случае это значение urn:yournamespace.
Вот и всё. Теперь описание типов видно в основном файле описания веб-сервиса.

Удачи вам с “выходом в мир”!

Переносимость wsdl файлов между серверами

Думаю у многих, кто сталкивался с разработкой вебсервисов с описанием их через WSDL файлы, возникала проблема, когда при переносе с dev-сервера на prod-сервер приходилось менять путь к расположению веб-сервера, к примеру:

<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="http://localhost/soapServer.php"/>

или, скажем, когда урл сервера используется в качестве namaspace, и хочется, чтобы на прод-сервере фигурирувал именно его урл, а не какой-нибудь localhost.
При переносе между серверами частенько забывается поменять упомянутые выше параметры wsdl файла и бывает так, что веб-сервис не хочет работать, пока об этом не вспомнишь.

Во избежание таких ситуаций можно предложить простой, и довольно очевидный метод – использование РНР для генерации адреса сервера!

Т.е. мы отдаем клиенту не WSDL в чистом виде, а результат, полученый после обработки его РНР интерпретатором. Тогда мы можем использовать РНР функции и встроенные переменные, в частности переменную $_SERVER, которая позволит нам получить необходимую информацию.

Т.о., мы сможем написать путь к местоположению сервера как

<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="http://' . $_SERVER['SERVER_NAME'] . '/soapServer.php"/>

Вот и вся магия! Возможно, данная заметка кому-то будет полезной.