Проблема интеграции "разношерстных" приложений волнует программистов не один десяток лет. Было создано огромное количество технологий и средств, для решения этой проблемы, одно из этих решений это технология Web-сервисов. В данной статье хочу просто и доступно рассказать, а возможно и показать, что же это за штука такая - web-сервис.
Web-сервисы (web-службы) это одна из клиент-серверных технологий, которая позволяет приложениям взаимодействовать друг с другом независимо от платформы, на которой они развернуты, от языка программирования, на котором они написаны. По сути это набор интерфейсов, которые описывают набор операций (функций), которые могут быть вызваны удаленно по сети, использую стандартизированные XML сообщения.
Всегда, для лучшего понимания я люблю использовать примеры, как говориться: - «на примерах учимся».
Примеры использования
Допустим нам, необходимо получать какие либо данные, которые находятся удаленно по сети. Это могут быть данные из БД ,или это данные из приложения, которое написано на другом, в отличии от нашего приложения, языке программирования, или это данные из закрытой системы. Либо мы хотим передавать (транслировать), данные сторонним приложениям, как говориться - предоставлять сервисы, то есть давать возможность выполнять какие либо операции на своем сервере приложений.
Простейшие примеры из жизни, это сервисы погоды, или сервисы курсов валют, которые мы можем использовать в своих системах.
Схема взаимодействия

Рисунок 1.
На рисунке 1 схематично показан процесс взаимодействия двух приложений.
где, WSDL - (Web Services Description Language) Язык описания внешних интерфейсов web-сервисов, на базе XML.
SOAP - (Simple Object Access Protocol) Протокол обмена сообщениями на базе XML.
Если нам необходимо предоставить возможность вызова наших методов (функции процедуры), сторонними программными средствами нам необходимо описать их с помощью WSDL.
После этого необходимо зарегистрировать (грубо говоря - опубликовать) эти методы на сервере приложений. Где под термином «сервер приложений» - подразумевается, комплекс программных средств для организации выполнения пользовательских программных модулей. Примерами данного сервера может служить простой web-сервер
Apache или web-сервер Tomcat.
Теперь более детально схему работы можно представить в следующем виде

Рисунок 2.
Из приведенной схемы видно, что при регистрации сервиса на сервере приложений происходит добавление записи о нем в реестре сервисов и уже благодаря этому реестру «приложение получатель» может получить доступ, к необходимому сервису, и затем непосредственно доступ к его методам. После получения доступа, обычно это сопровождается процессом авторизации, аутентификации, «приложение получатель» может организовать диалог с «поставщиком сервиса» в виде запрос-ответ.
Под «запросом» подразумевается вызов метода (процедуры, функции), под «ответом» - результат выполнения вызванного метода. Если это процедура, те возвращать нечего, то нам приходит ответ, что процедура успешно выполнена. В случае ошибки приходит сообщении описанием возникшей ошибки или исключения.
Обычно все «общение» происходит на базе протокола HTTP.
Краткое введение в язык WSDL.
По сути WSDL-описание это XML документ с определенной структурой.
Каждый документ WSDL можно разбить на три логические части:
- определение типов данных — определение вида отправляемых и получаемых сервисом XML сообщений
- абстрактные операции — список операций, которые могут быть выполнены с сообщениями
- связывание сервисов — способ, которым сообщение будет доставлено
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.example.org/NewWSDLFile/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NewWSDLFile"
targetNamespace="http://www.example.org/NewWSDLFile/">
<wsdl:types>
<xsd:schema
targetNamespace="http://www.example.org/NewWSDLFile/">
<xsd:element name="NewOperation">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="NewOperationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="NewOperationRequest">
<wsdl:part element="tns:NewOperation" name="parameters" />
</wsdl:message>
<wsdl:message name="NewOperationResponse">
<wsdl:part element="tns:NewOperationResponse" name="parameters" />
</wsdl:message>
<wsdl:portType name="NewWSDLFile">
<wsdl:operation name="NewOperation">
<wsdl:input message="tns:NewOperationRequest" />
<wsdl:output message="tns:NewOperationResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="NewWSDLFileSOAP" type="tns:NewWSDLFile">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="NewOperation">
<soap:operation
soapAction="http://www.example.org/NewWSDLFile/NewOperation" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="NewWSDLFile">
<wsdl:port binding="tns:NewWSDLFileSOAP"
name="NewWSDLFileSOAP">
<soap:address location="http://www.example.org/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Как видно из примера в начале документа идет секция описания типов.
<wsdl:types>
<xsd:schema
targetNamespace="http://www.example.org/NewWSDLFile/">
<xsd:element name="NewOperation">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="NewOperationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
В которой объявляются два элемента со своими комплексными типами
Это «NewOperation» и «NewOperationResponse».
<wsdl:message name="NewOperationRequest">
<wsdl:part element="tns:NewOperation" name="parameters" />
</wsdl:message>
<wsdl:message name="NewOperationResponse">
<wsdl:part element="tns:NewOperationResponse" name="parameters" />
</wsdl:message>
В данной секции мы описали сообщения:
NewOperationRequest – запрос
NewOperationResponse – ответ
Сославшись на выше определенные элементы.
NewOperationRequest – запрос
NewOperationResponse – ответ
Сославшись на выше определенные элементы.
<wsdl:portType name="NewWSDLFile">
<wsdl:operation name="NewOperation">
<wsdl:input message="tns:NewOperationRequest" />
<wsdl:output message="tns:NewOperationResponse" />
</wsdl:operation>
</wsdl:portType>
Тут описан «порт» с методом - NewOperation.
<wsdl:binding name="NewWSDLFileSOAP" type="tns:NewWSDLFile">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="NewOperation">
<soap:operation
soapAction="http://www.example.org/NewWSDLFile/NewOperation" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
Затем мы его связали с протоколом SOAP, указав при этом что тип пакетов SOAP – document и тип сообщений (входящих.исходящих) будит – literal и событие по которому будет вызываться метод - http://www.example.org/NewWSDLFile/NewOperation.
<wsdl:service name="NewWSDLFile">
<wsdl:port binding="tns:NewWSDLFileSOAP"
name="NewWSDLFileSOAP">
<soap:address location="http://www.example.org/" />
</wsdl:port>
</wsdl:service>
Ну и собственно сам сервис, который связан с «портом»
Для более подробной информации о языке описания внешних интерфейсов web-сервисов можно посмотреть его спецификацию (http://www.w3.org/TR/wsdl20 или http://www.w3.org/TR/wsdl).
По сути для того чтобы описать свой сервис, необязательно вручную создавать этот документ, все это генерируется средствами сервера приложения либо, что достаточно часто распространено, средствами IDE в которой разрабатывается сервис.
В следующей статье я планирую более подробно описать процесс создания сервиса на языке программирования Java.
Полезные ссылки:
- Краткая информация о WSDL (http://ru.wikipedia.org/wiki/WSDL)
- Краткая информация о SOAP (http://ru.wikipedia.org/wiki/SOAP)
Комментариев нет:
Отправить комментарий