IZONE - http://www.izcity.com/ - бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

Веб-сервисы и SOAP

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

Валентин Колесов

Что такое SOAP

В настоящее время используемые технологии удаленного вызова методов (DCOM, CORBA/IIOP и RMI) довольно сложны в настройке и организации взаимодействия. Это влечет за собой проблемы в эксплуатации и функционировании распределенных систем (проблемы безопасности, транспорт через брандмауэры и т.д.). Существующие проблемы успешно решены созданием SOAP (Simple Object Access Protocol), простого протокола, основанного на XML, для обмена сообщениями в распределенных средах (WWW). Он предназначен для создания веб-сервисов и удаленного вызова методов. SOAP можно использовать с разными транспортными протоколами, включая HTTP, SMTP и т.д.

Что такое веб-сервисы

Веб-сервисы - это функциональность и данные, предоставляемые для использования внешними приложениями, которые работают с сервисами посредством стандартных протоколов и форматов данных. Веб-сервисы полностью независимы от языка и платформы реализации. Технология веб-сервисов является краеугольным камнем программной модели Microsoft .NET.

Для демонстрации возможностей SOAP я использовал недавно вышедшую реализацию SOAP Toolkit версии 2.0 от Microsoft. Следует заметить, что текущая версия Toolkit заметно отличается от предыдущей (Microsoft SOAP Toolkit for Visual Studio 6.0) и от бета версии SOAP Toolkit 2.0.

Механизм взаимодействия клиента и сервера

  1. Клиентское приложение создает экземпляр объекта SOAPClient

  2. SOAPClient читает файлы описания методов веб-сервиса (WSDL и Web Services Meta Language - WSML). Эти файлы могут храниться и на клиенте.

  3. Клиентское приложение, используя возможности позднего связывания методов объекта SOAPClient, вызывает метод сервиса. SOAPClient формирует пакет запроса (SOAP Envelope) и отправляет на сервер. Возможно использование любого транспортного протокола, но, как правило, используется HTTP.

  4. Пакет принимает серверное приложение Listener (может представлять собой ISAPI приложение или ASP страницу), создает объект SOAPServer и передает ему пакет запроса

  5. SOAPServer читает описание веб-сервиса, загружает описание и пакет запроса в XML DOM деревья

  6. SOAPServer вызывает метод объекта/приложения, реализующего сервис

  7. Результаты выполнения метода или описание ошибки конвертируются объектом SOAPServer в пакет ответа и отправляются клиенту

  8. Объект SOAPClient проводит разбор принятого пакета и возвращает клиентскому приложению результаты работы сервиса или описание возникшей ошибки.

WSDL файл это документ в формате XML, описывающий методы, предоставляемые веб-сервисом. Также параметры методов, их типы, названия и местонахождение Listener`а сервиса. SOAP Toolkit визард автоматически генерирует этот документ.

Фрагмент WSDL файла:

...
 <message name=" SOAPClass.SubtractNumbers">
 <part name="NumberOne" type="xsd:double" /> 
 <part name="NumberTwo" type="xsd:double" /> 
 </message>

<message name=" SOAPClass.SubtractNumbersResponse"> <part name="Result" type="xsd:double" /> </message>

<message name=" SOAPClass.AddNumbers"> <part name="NumberOne" type="xsd:double" /> <part name="NumberTwo" type="xsd:double" /> </message>

<message name=" SOAPClass.AddNumbersResponse"> <part name="Result" type="xsd:double" /> </message> ...

SOAP Envelope (Пакет) - XML документ, который содержит в себе запрос/ответ на выполнение метода. Удобнее всего рассматривать его как почтовый конверт, в который вложена информация.

Тэг Envelope должен быть корневым элементом пакета. Элемент Header не обязателен, а Body должен присутствовать и быть прямым потомком элемента Envelope. В случае ошибки выполнения метода сервер формирует пакет, содержащий в тэге Body элемент Fault, который содержит подробное описание ошибки.

Если вы пользуетесь высокоуровневыми интерфейсами SOAPClient, SOAPServer, то вам не придется вдаваться в тонкости формата пакета, но, при желании, можно воспользоваться низкоуровневыми интерфейсами или же вообще создать пакет «руками».

Объектная модель SOAP Toolkit дает возможность работать с объектами низкоуровневого API:

  • SoapConnector - Обеспечивает работу с транспортным протоколом для обмена SOAP пакетами

  • SoapConnectorFactory - Обеспечивает метод создания коннектора для транспортного протокола, указанного в WSDL файле (тэг <soap:binding>)

  • SoapReader - Читает SOAP сообщения и строит XML DOM деревья

  • SoapSerializer - Содержит методы создания SOAP сообщения

  • IsoapTypeMapper, SoapTypeMapperFactory - Интерфейсы, позволяющие работать со сложными типами данных

Используя объекты высокоуровневого API можно передавать данные только простых типов (int, srting, float …), но спецификация SOAP 1.1 допускает работу с более сложными типами данных, например с массивами, структурами, списками и их комбинациями. Для работы с такими типами приходится использовать интерфейсы IsoapTypeMapper и SoapTypeMapperFactory.

Пример

Для работы серверного приложения потребуются IIS 5 на Windows 2000 или IIS4 на Windows NT 4.0 Service Pack 6. Установленный SOAP Toolkit версии 2.0

Требования клиентского приложения - Microsoft® Windows® 98, Microsoft Windows ME, Microsoft Windows NT® 4.0 Service Pack 6 или Microsoft Windows 2000 Service Pack 1. Установленный SOAP Toolkit версии 2.0

Создание сервера

Откройте в VB новый проект ActiveX DLL. Измените название класса на SOAPClass, а имя проекта на SOAPProj.

В классе создайте следующие методы:

 Public Function AddNumbers(ByVal NumberOne As Double, _
 ByVal NumberTwo As Double) _
 As Double

 AddNumbers = NumberOne + NumberTwo

 End Function

 Public Function SubtractNumbers(ByVal NumberOne As Double, _
 ByVal NumberTwo As Double) _
 As Double

 SubtractNumbers = NumberOne - NumberTwo

 End Function
 

Откомпилируйте DLL.

Теперь запустите приложение WSDL Generator (wsdlgen.exe). Сообщите визарду, как вы хотите назвать сервис, например SOAPService, затем укажите путь к только что созданному объекту. Теперь можно выбрать методы, которые войдут в веб-сервис. Мы выберем все методы. Затем нужно указать, где будет находиться веб-приложение, например http://wsd010/soap/, тип Listener`а (может быть ASP и ISAPI) выберем ASP, формат схемы (по умолчанию). Укажем путь, где будут находиться файлы описания веб-сервиса и кодировку.

Теперь в веб-каталоге появились файлы ASP, WSDL и WSML это Listener и описания сервиса. Теперь нужно настроить права доступа к веб-приложению – желательно NT Challenge/Response authentication.

На этом работы по созданию сервера закончены.

Создание клиента

Откройте в VB новый проект Standard EXE.

В меню Project/References сделайте ссылку на библиотеку Microsoft SOAP type library.

Создайте на форме кнопку, в обработчике нажатия кнопки напишите следующий код:

 Dim SoapClient As New SoapClient

 SoapClient.mssoapinit "http://soap.server.com/ soap/SOAPService.wsdl"
 MsgBox SoapClient.AddNumbers(4, 3)
 MsgBox SoapClient.SubtractNumbers(3, 2)
 

Не забудьте изменить название сервера.

После создания объекта SOAPClient его надо инициализировать – указать путь к документу описания веб-сервиса. После инициализации у объекта появятся методы веб-сервиса. И с ними можно работать как с обычным COM объектом.

Воспользовавшись замечательной утилитой MsSoapT.exe, входящей в Toolkit, можно просматривать пакеты от клиента серверу и обратно в реальном времени. Для этого надо в WSDL файле найти тэг <soap:address> и вместо строки типа http://soap.server.com/soap/ SOAPService.ASP написать http://soap.server.com:8080/ soap/SOAPService.ASP то есть указать порт 8080. После этого запускаем утилиту трассирования и соглашаемся с настройками по умолчанию, затем создаем новый Formatted Trace. Теперь все SOAP пакеты работы с веб-сервисом можно просматривать on-line. Когда трассировщик не загружен, то в <soap:address> нужно убрать указание порта 8080.

Пакет запроса на выполнение метода SubstractNumbers

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<SOAP-ENV:Envelope
 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/ soap/encoding/"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/ soap/envelope/">
 <SOAP-ENV:Body>
 <SOAPSDK1:SubtractNumbers
 xmlns:SOAPSDK1="http://tempuri.org/message/">
 <NumberOne>3</NumberOne>
 <NumberTwo>2</NumberTwo>
 </SOAPSDK1:SubtractNumbers>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
 

Пакет ответа на выполнение метода SubstractNumbers

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<SOAP-ENV:Envelope
 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/ soap/encoding/"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/ soap/envelope/">
 <SOAP-ENV:Body>
 <SOAPSDK1:SubtractNumbersResponse
 xmlns:SOAPSDK1="http://tempuri.org/message/">
 <Result>1</Result>
 </SOAPSDK1:SubtractNumbersResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
 

Пакет сервера, в ответ на запрос некорректного формата

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<SOAP-ENV:Envelope
 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/ soap/encoding/"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/ soap/envelope/">
 <SOAP-ENV:Body>
 <SOAP-ENV:Fault>
 <faultcode>SOAP-ENV:Server</faultcode>
 <faultstring>
 Connector - Bad request to the server.

 </faultstring>
 <detail>
 <mserror:errorInfo
 xmlns:mserror=
 "http://schemas.microsoft.com/
 soap-toolkit/faultdetail/error/

 ">
 <mserror:returnCode>-2146823238</mserror:returnCode>
 <mserror:callStack>
 <mserror:callElement>
 <mserror:description>
 <HRESULT>800a13ba</HRESULT>
 
</mserror:description>
 </mserror:callElement>
 </mserror:callStack>
 </mserror:errorInfo>
 </detail>
 </SOAP-ENV:Fault>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Линки по теме:
msdn.microsoft.com/webservices и
msdn.microsoft.com/soap - последние новости о SOAP и веб-сервисах от Microsoft. Там же можно скачать свежий софт.
www.vbxml.com/soap - много полезной информации для разработчиков. Есть презентации и учебники по SOAP.
www.w3.org/TR/SOAP - спецификация SOAP от W3C
www.w3.org/TR/wsdl - стандарт Web Services Definition Language (WSDL) 1.1
microsoft.public.xml.soap – в этой конференции специалисты помогут решить сложные проблемы программирования SOAP.

Источник (оригинал)- SoftТерра, http://www.softerra.ru

 


Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com