Язык WSDL (Web Service Description Language) предназначен для описания Web-служб. В основе WSDL лежит язык XML.
С помощью WSDL представляются типы данных, операции и привязки.
Описание сервиса на языке WSDL выглядит довольно громоздко. Однако это не является осложняющим фактором, поскольку для генерации WSDL-файлов имеются удобные редакторы, примером которых могут служить XML Spy.
В начале WSDL-описания указывается имя сервиса, ссылка на пространство имен WSDL и на целевое пространство имен (targetNamespace), которому будут принадлежать все имена, объявляемые в этом документе.
Далее следуют части WSDL-описания: типы данных, используемых Web-службой (types); сообщения (message) — формат запросов и ответов; типы портов (portType) — набор операций, выполняемых Web-службой; связи (binding) — адрес для вызова операции (service):
<definitions
name="имя сервиса"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://...
>
<types> ...
<message> ...
<portType> ...
<binding> ...
<service> ...
</definition>
Типы данных, фигурирующие в сообщениях, которыми обмениваются пользователи распределенных приложений, должны правильно интерпретироваться как отправителем, так и получателем. Поэтому типы описываются с помощью XML-схемы, входящей в WSDL-файл, т.е. становятся доступными обоим участникам связи. Пример части types (вместо многоточия должны быть указаны конкретные имена и элементы):
<types>
  <xsd:schema
    targetNamespace="http://..."
    xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
     <xsd:complexType>
       <xsd:sequence>
        <xsd:element name="..." type="..."/>
         ...
       </xsd:sequence>
     </xsd:complexType>
     </xsd:element name="..." type="..."/>>
         ...
   </xsd:schema>
</types>
Часть message служит для указания данных, которыми будут обмениваться участники связи.
Часть message состоит из одного или более элементов part, где каждый элемент part ассоциирован или с element (при использовании документ-стиля), или с type (при использовании RPC-стиля). В случае документ-стиля базовая структура описания сообщения имеет вид (* означает нуль или более):
<message name="..."> *
  <part name="..." element="..."/> *
</message>
В случае RPC-стиля в теге part вместо element="..." записывается type="..." и значение атрибута name из тега part становится именем элемента в конкретном сообщении.
Часть portType (иначе интерфейс) определяет группу операций. Операции в WSDL служат для интерпретации данных, содержащихся в сообщениях.
Каждая операция (operation) содержит элементы input и/или output (при наличии элемента output возможен еще элемент fault). Параметр message у элементов input и output указывает на описание соответствующего сообщения (message).
<portType name="...">
...
  <operation name="...">
    <input message="..."/>
    <output message="..."/>
  </operation>
...
</portType>
Имеется несколько вариантов операций. Если элемент input предшествует элементу output, то конечный узел получает сообщение и отправляет соответствующий ответ. Такая операция называется запрос-ответ (request-response). Обратный порядок output и input определяет операцию требование-ответа (solicit-response), при которой конечный узел отправляет сообщение и получает соответствующий ответ. При наличии только элемента input имеем однонаправленную операцию — сообщение получает конечный узел. Операция, содержащая только элемент output, означает отправку сообщения конечным узлом.
Связи (привязки) используются для отображения типов данных и операций на транспортный протокол. Атрибут type в теге binding ссылается на конкретный portType (интерфейс). Далее указываются тип сервиса (например, SOAP или MIME), стиль представления (document или RPC), транспортный протокол (атрибут transport). Для каждой операции нужно задать URI получателя сообщения (атрибут soapAction, его значение используется в HTTP-заголовке). Имя в теге operation ссылается на имя операции в части portType.
Элемент soap:body определяет, как части сообщения появляются в SOAP-элементе Body. В случае документ-стиля значение атрибута use есть "literal" и это означает, что тело сообщения будет содержать XML-документ и что части сообщения определяют XML-элементы. Использование стиля RPC в SOAP показывает, что тело будет содержать XML-представление вызова метода и что части сообщения представляют параметры метода (use="encoded").
Структура части binding в случае SOAP, транспортного протокола HTTP и стиля RPC имеет вид:
<binding name="..." type="...">
  <soap:binding style="rpc"
     transport=
      "http://schemas.xmlsoap.org/soap/http"/>
  <operation name="...">
      <soap:operation soapAction="..."/>
          <input>
              <soap:body
               use="encoded"
               encodingStyle=
        "http://schemas.xmlsoap.org/soap/encoding/" />
          </input>
          <output>
              <soap:body
               use="encoded"
               encodingStyle=
        "http://schemas.xmlsoap.org/soap/encoding/" />
          </output>
   </operation>
   ...
   <operation name="...">
       <soap:operation soapAction="..."/>
          <input>
               <soap:body use="literal"/>
          </input>
          <output>
               <soap:body use="literal"/>
          </output>
   </operation>
</binding>
Часть service может описывать несколько портов для разных транспортных протоколов и служит для задания имени (service name="...") и адреса сервиса (location="http:..."). Атрибут binding указывает на имя, присвоенное помещенной выше части binding.
<service name="...">
      <port name="..."
        binding="...">
         <soap:address
           location="http:..."/>
      </port>
</service>
Ниже приведен пример, взятый из источника [1], WSDL-документа, описывающего Веб-сервис, предоставляющий всего одну операцию Sum (сложение двух целых чисел).
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:s="http://www.w3.org/2001/XMLSchema"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:s0="http://tempuri.org"
                  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
                  targetNamespace="http://tempuri.org" xmlns="http://schemas.xmlsoap.org/wsdl/">
//Описание типов данных аргументов метода и возвращаемого значения
  <types>
      <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org">
// Методу Sum передаются два аргумента val1 и val2 с указанными типами данных
      <s:element name="Sum">
         <s:complexType>
            <s:sequence>
               <s:element name="val1" type="s:long" minOccurs="0" />
               <s:element name="val2" type="s:long" minOccurs="0" />
            </s:sequence> 
         </s:complexType> 
      </s:element>
// Описание типа данных возвращаемого методом значения
      <s:element name="SumResponse">
         <s:complexType>
            <s:sequence>
                <s:element name="SumResult" type="s:long" minOccurs="0" />
            </s:sequence>
         </s:complexType>
      </s:element>
     </schema>
  </types>
// Описание входящего сообщения метода Sum c входящим сообщением; ассоциирован 
//тип данных Sum
  <message name="SumSoapIn">
     <part name="parameters" element="s0:Sum" />
  </message>
// Описание исходящего сообщения метода Sum c исходящим сообщением; ассоциирован тип данных 
//  SumResponse
  <message name="SumSoapOut">
     <part name="parameters" element="s0:SumResponse" />
  </message>
// Описание операций (методов), предоставляемых Веб-сервисом
  <portType name="ArithmeticSoap">
// Данный Веб-сервис предоставляет операцию Sum, операция имеет входящее сообщение SumSoapIn
// и исходящее сообщение SumSoapOut
      <operation name="Sum">
          <input message="s0:SumSoapIn" />
          <output message="s0:SumSoapOut" />
      </operation>
  </portType>
// Определение формата сообщения и деталей протокола для каждого порта
  <binding name="ArithmeticSoap" type="s0:ArithmeticSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
     <operation name="Sum">
        <soap:operation soapAction="http://tempuri.org/Web.Arithmetic.Sum" style="document" />
        <input>
           <soap:body use="literal" />
        </input>
        <output>
           <soap:body use="literal" />
        </output>
    </operation>
  </binding>
// Определяет имя сервера Веб-служб, позволяет объединить внутри себя несколько портов 
// (наборов методов), определяет расположение сервиса
  <service name="Arithmetic">
      <port name="ArithmeticSoap" binding="s0:ArithmeticSoap">
          <soap:address location="http://MASHA:1972/csp/www/Web.Arithmetic.cls" />
      </port>
  </service>
</definitions>
Список литературы
1. Использование Веб-сервисов в Caché. — http://itsecure.org.ua/publ/52-1-0-198