
Июнь 2004
Профессионалу разработчику
Валентин Колесов
Веб-сервисы и SOAP
Источник: сервер KnowHow,
База знаний для IT-специалистов,
http://knowhow.virtech.ru/asp/qa.asp?noparma=ziwk&mode=document&gid=50.2
оригинал-источник: SoftТерра,
http://www.softerra.ru
Веб-сервисы и 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.
Механизм взаимодействия клиента и сервера
-
Клиентское приложение создает экземпляр объекта SOAPClient
-
SOAPClient читает файлы описания методов веб-сервиса (WSDL и Web Services Meta Language - WSML). Эти файлы могут храниться и на клиенте.
-
Клиентское приложение, используя возможности позднего связывания методов объекта SOAPClient, вызывает метод сервиса. SOAPClient формирует пакет запроса (SOAP Envelope) и отправляет на сервер. Возможно использование любого транспортного протокола, но, как правило, используется HTTP.
-
Пакет принимает серверное приложение Listener (может представлять собой ISAPI приложение или ASP страницу), создает объект SOAPServer и передает ему пакет запроса
-
SOAPServer читает описание веб-сервиса, загружает описание и пакет запроса в XML DOM деревья
-
SOAPServer вызывает метод объекта/приложения, реализующего сервис
-
Результаты выполнения метода или описание ошибки конвертируются объектом SOAPServer в пакет ответа и отправляются клиенту
-
Объект 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.
|