Опубликован: 11.05.2007 | Доступ: свободный | Студентов: 1698 / 235 | Оценка: 4.36 / 4.25 | Длительность: 16:06:00
Лекция 3:

Описание интерфейса программной компоненты

< Лекция 2 || Лекция 3: 123 || Лекция 4 >

3.4. WSDL: описание интерфейса программной компоненты

Для описания интерфейса программной компоненты, включая спецификацию корректных сообщений, был разработан язык WSDL (Web Service Definition Language). Описание на языке WSDL включает в себя следующие семь составляющих (рис. 3.3).

Составные части WSDL документа

Рис. 3.3. Составные части WSDL документа
  1. Описание типов передаваемых данных. При использовании кодирования SOAP Document оно состоит из схемы XML, определяющей корректные сообщения, получаемые программной компонентой в теле пакета SOAP.
  2. Описание входящих и исходящих сообщений, которые связываются с описанными типами данных.
  3. Описание операций (сервисов программной компоненты), с каждой из которых связывается входящее и исходящее сообщение.
  4. Описание типов портов (идентификаторов программных компонент), с каждым из которых связывается некоторый набор операций.
  5. Описание привязок ( binding ), связывающие типы портов и их сообщений с определенным типом кодирования тела пакета, а также с версией протокола SOAP.
  6. Описание портов, связывающие типы портов и соответствующие им привязки с конкретными URL.
  7. Общее описание службы (интерфейса программной компоненты) как совокупности портов.

Далее рассмотрено описание на языке WSDL интерфейса компоненты, которое содержит два сервиса – сложение двух чисел и сложение последовательности чисел. В корневом элементе указаны все используемые пространства имен, включая пространство протокола SOAP 1.2 – http://schemas.xmlsoap.org/wsdl/soap12/.

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions 
    xmlns:tns="http://summa.test/webservices" 
    xmlns:s="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"         
    targetNamespace="http://summa.test/webservices" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

В элементе wsdl:types описываются все типы данных. Тип Add будет связан со входящим сообщением сервиса сложения двух чисел, а тип AddResponse – с его исходящим сообщением.

<wsdl:types>
    <s:schema elementFormDefault="qualified" 
        targetNamespace="http://summa.test/webservices">
      <s:element name="Add">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="message" 
                type="tns:AddMessage" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="AddMessage">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" 
                name="a" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" 
                name="b" type="s:int" />
        </s:sequence>
      </s:complexType>
      <s:element name="AddResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" 
                  name="AddResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>

Типы SumList и SumListResponse предназначены для сообщений сервиса сложения списка чисел.

<s:element name="SumList">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="list" 
                type="tns:ArrayOfInt" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfInt">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" 
                name="int" type="s:int" />
        </s:sequence>
      </s:complexType>
      <s:element name="SumListResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="SumListResult" 
                type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>

В элементах wsdl:message типы данных связываются с идентификаторами сообщений.

<wsdl:message name="AddSoapIn">
    <wsdl:part name="parameters" element="tns:Add" />
  </wsdl:message>
  <wsdl:message name="AddSoapOut">
    <wsdl:part name="parameters" element="tns:AddResponse" />
  </wsdl:message>
  <wsdl:message name="SumListSoapIn">
    <wsdl:part name="parameters" element="tns:SumList" />
  </wsdl:message>
  <wsdl:message name="SumListSoapOut">
    <wsdl:part name="parameters" element="tns:SumListResponse" />
  </wsdl:message>

В элементе wsdl:portType описываются абстрактные операции и используемые ими сообщения.

<wsdl:portType name="MathServiceSoap">
    <wsdl:operation name="Add">
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    Операция Add складывает два числа
</wsdl:documentation>
      <wsdl:input message="tns:AddSoapIn" />
      <wsdl:output message="tns:AddSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="SumList">
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
           Операция SumList складывает несколько чисел
      </wsdl:documentation>
      <wsdl:input message="tns:SumListSoapIn" />
      <wsdl:output message="tns:SumListSoapOut" />
    </wsdl:operation>
  </wsdl:portType>

В элементе wsdl:binding операции связываются с транспортным протоколом (HTTP), версией протокола SOAP (1.2) и типом кодирования тела пакета (SOAP-Document).

<wsdl:binding name="MathServiceSoap12" type="tns:MathServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Add">
      <soap12:operation soapAction="http://summa.test/webservices/Add" 
           style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="SumList">
      <soap12:operation soapAction="http://summa.test/webservices/SumList" 
           style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

В элементе wsdl:service интерфейс программной компоненты связывается с типом порта, с некоторой привязкой, а также с конкретным URL, используемым в дальнейшем для вызова веб службы.

<wsdl:service name="MathService">
    <wsdl:port name="MathServiceSoap12" binding="tns:MathServiceSoap12">
      <soap12:address location="http://summa.test/webservices/summa.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Как видно из примера, структура документа на языке WSDL является достаточно сложной, однако благодаря ей одни и те же абстрактные операции могут быть связаны с различными способами передачи информации, включая как разные транспортные протоколы, так и различные версии спецификации SOAP. Для реализации удаленного вызова на основе данной спецификации необходимы средства как для создания WSDL документа по описанию используемого удаленно класса, так и средство создания по известному WSDL документу посредника удаленного вызова.

3.5. Выводы по описанию интерфейса компоненты

Для создания открытой распределенной системы необходимо использование общепринятых языков описания интерфейса программной компоненты. В настоящий момент существует ряд апробированных на практике стандартов для передачи данных в гетерогенных распределенных системах: XML, XSD, SOAP и WSDL. Их использование позволяет создавать системы, не привязанные жестко к какому либо средству разработки программ или транспортному протоколу. Однако открытый характер спецификации SOAP допускает как реализацию использующей ее промежуточной средой некоторой дополнительной функциональности, так и принятие все новых стандартов и расширений, использующих заголовки SOAP. Это может привести к определенным сложностям при взаимодействии основанных на WSDL и SOAP программных компонент различных разработчиков.

< Лекция 2 || Лекция 3: 123 || Лекция 4 >