October 27, 2010

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

Здесь я покажу пример описания типов во внешнем файле и подключении этого файла в wsdl-описании вашего веб-сервиса.

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

Обратите внимание, что этот импортируемый файл должен быть полноценным xml файлом — с блоком

в начале документа.

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


<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"/>

Файл описания типов данных необходимо подключать в блоке <strong><wsdl:types/></strong>:

<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’ам (аттрибут <strong>namespace</strong> тэга <strong>import</strong>). А именно, чтобы значение аттрибута namespace точно соответствовало аттрибуту <strong>targetNamespace</strong> в подключенном файле схемы. В нашем случае это значение urn:yournamespace.

Вот и всё. Теперь описание типов видно в основном файле описания веб-сервиса.

Удачи вам с «выходом в мир»!