Технологии для Web-сервисов
Ключевые технологии для Web-сервисов
Дополнительные стандарты и технологии для Web-сервисов
XML Digital Signatures (XML-DSIG)
Security Assertions Markup Language (SAML)
Extensible Key Management Specification (XKMS)
Web Services Flow Language (WSFL)
В этом обзоре мы рассмотрим основные технологии, на которых базируются Web-сервисы, а также различные дополнения, предлагаемые ведущими производителями и соответствующими органами стандартизации. Мы рассмотрим такие технологии, как eXtensible Markup Language (XML), Simple Object Access Protocol (SOAP), Web Services Description Language (WSDL) и Universal Description, Discovery and Integration (UDDI), а также такие спецификации, как ebXML, XML Digital Signatures, Security Assertions Markup Language, Extensible Key Management Specification, Web Services Flow Language, WS-Inspection, WS-Security, WS-License, WS-Routing и WS-Referral.
Ключевые технологии для Web-сервисов
eb-сервисы базируются на четырех ключевых технологиях: eXtensible Markup Language (XML), Simple Object Access Protocol (SOAP), Web Services Description Language (WSDL) и Universal Description, Discovery and Integration (UDDI). Эти технологии используются для обеспечения функционирования Web-сервисов и связаны между собой так, как показано на следующем рисунке.
Обсуждение ключевых технологий для Web-сервисов мы начнем с протокольного уровня, показанного в нижней части диаграммы. Протокольный уровень содержит стандартные Internet-протоколы, используемые для вызова Web-сервисов по сети. Изначально Web-сервисы базируются на протоколе HTTP/1.1 (или HTTP), но ничто не мешает использовать и другие транспортные протоколы, например SMTP или FTP. Протокол HTTP/1.1 — это текстовый протокол в стиле «запрос-ответ», подразумевающий следующую последовательность действий: клиент открывает соединение с сервером и посылает запрос в специфичном для протокола формате. Сервер отвечает на данный запрос и при необходимости оставляет соединение открытым.
Язык XML
Язык XML играет важную роль в Web-сервисах — он является основой для таких технологий, как SOAP и WSDL, а также определяет формат данных, используемый для обмена информацией между потребителем сервиса и самим сервисом. XML не является языком как таковым — это синтаксис для описания структур данных, мета-язык, позволяющий осуществлять кросс-платформенный обмен данными с помощью стандартных методов для кодирования и форматирования информации. В отличие от HTML, XML позволяет не только описывать структуру информации, но и ее контекст. Посредством XML структуру документа, ее содержимое и способы ее отображения можно представить в виде трех различных компонентов. Таким образом, один и тот же документ может быть отображен различными способами, например в зависимости от типа клиента или от типа запрашиваемого документа. Следует отметить, что все средства создания и потребления Web-сервисов содержат библиотеки для обработки XML-документов. Это могут быть библиотеки, поддерживающие XML Document Object Model (DOM), SAX или, как в случае с .NET Framework, — «pull»-модель для извлечения и обработки информации из XML-документов.
SOAP
SOAP (Simple Object Access Protocol, хотя более актуальным следует считать название Services-Oriented Architecture Protocol) — это основанный на языке XML стандарт для взаимодействия между сервисами и их потребителями. Версия SOAP 1.0 была разработана рядом компаний, таких как Userland, Microsoft и Developmentor, и содержала элементы, специфичные для COM и HTTP, — протокол SOAP обязан своим рождением прототипу XML-RPC, использовавшемуся для реализации удаленных вызовов процедур через XML (http://www.xmlrpc.com/spec/). Предложенная в апреле 2000 года версия SOAP 1.1 (http://www.w3.org/TR/SOAP/) пополнилась вкладом от таких фирм, как IBM и Lotus, и содержала следующие изменения:
- нейтральность к транспортному уровню (возможно использование не только протокола HTTP);
- нейтральность к языку программирования и платформе (Java);
- нейтральность к кодировке данных;
- полная независимость от компаний;
- полная независимость от объектных моделей и операционных систем.
В настоящее время развитием протокола SOAP занимается комитет World Wide Web Consortium — в сентябре 2000 года была создана рабочая группа под названием XML Protocol (XMLP), задачей которой является разработка протокола, нейтрального ко всему (транспортному уровню, языку программирования, объектной модели, операционной системе и т.п.), кроме языка XML, используемого для представления данных. Более подробно о деятельности этой группы можно узнать по адресу: http://www.w3.org/2000/xp/Group/. Протокол SOAP 1.2 является текущим рабочим документом комитета W3C (SOAP Version 1.2 Working Draft: 9 July 2001) и в скором времени должен стать рекомендацией. Отметим, что данный протокол будет называться именно SOAP 1.2, а не XML Protocol 1.0.
На сегодняшний день в различной степени готовности находятся стандарты:
- SOAP Version 1.2 Working Draft: 9 July 2001;
- XML Protocol Abstract Model Working Draft: 9 July 2001;
- XML Protocol Requirements Document;
- SOAP Security Extensions: Digital Signature (http://www.w3.org/TR/SOAP-dsig/);
- SOAP Messages with Attachments (http://www.w3.org/TR/SOAP-attachments/).
Протокол SOAP базируется на сообщениях, которые разделяются на два типа: запросы (вызов метода удаленного объекта) и ответы (результат работы удаленного метода). SOAP поддерживает два механизма доступа — SOAP RPC и SOAP Message. SOAP RPC представляет собой простой протокол «запрос-ответ» и базируется на объекте Call. Этот объект (и некоторые низкоуровневые методы для создания и отсылки сообщений) используется для синхронного удаленного вызова методов Web-сервисов.
SOAP Message — это протокол для отсылки и обработки SOAP-сообщений, который может использоваться для асинхронных коммуникаций и подразумевает немедленный или отложенный ответ на запрос. Протокол SOAP Message базируется на объекте Message. Разработчики могут использовать низкоуровневые интерфейсы SOAP API для создания и отсылки сообщений.
Протокол SOAP основан на понятии «конвертов», внутри которых и располагаются сообщения со специфичными для того или иного приложения данными. Ниже показан пример SOAP-запроса, посылаемого потребителем сервиса сервису.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://{soaporg}/envelope/" SOAP-ENV:encodingStyle="http://{soaporg}/encoding/"> <SOAP-ENV:Body> <m:GetLastTradePrice m:GetLastTradePrice xmlns:m xmlns:m="my my-ns ns"> <symbol> IBM </symbol> </m:GetLastTradePrice m:GetLastTradePrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
В ответ на данный запрос Web-сервис возвращает данные, также упакованные в SOAP-конверт:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://{soaporg}/envelope/" SOAP-ENV:encodingStyle="http://{soaporg}/encoding/"> <SOAP-ENV:Body> <m:GetLastTradePriceResponse m:GetLastTradePriceResponse xmlns:m xmlns:m="my my-ns ns"> <price> 95.25 </price> </m:GetLastTradePriceResponse m:GetLastTradePriceResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
С точки зрения приложения при использовании SOAP для вызова методов Web-сервисов требуется генерация запроса и обработка XML-документа, содержащего ответ. Мы можем использовать XSLT, SAX, DOM или JDOM для преобразования XML-документа в вид, более подходящий для конкретного приложения. По мере увеличения числа средств для создания и потребления Web-сервисов необходимость в непосредственной обработке XML-документов будет уменьшаться.
WSDL
Интерфейс для доступа к Web-сервису описывается на основанном на языке XML языке Web Services Description Language (WSDL) и содержит всю информацию, необходимую для доступа к данному сервису, — WSDL-документы можно сравнить с описаниями интерфейсов на языке IDL, только в первом случае используется язык XML. WSDL появился как результат объединения двух технологий: Network Accessible Service Specification Language (NASSL) фирмы IBM и Service Description Language (SDL) фирмы Microsoft. Спецификация WSDL 1.1 находится по адресу: http://www.w3.org/TR/wsdl/.
Существующие средства для создания и потребления Web-сервисов выполняют всю рутинную работу по генерации и обработке WSDL-документов, поэтому создание и обработка таких документов вручную требуется в крайне редких случаях.
WSDL-документ состоит из ряда элементов, описывающих Web-сервис:
- типы — контейнеры для описания типов данных, базирующиеся на XML Schema;
- сообщения — абстрактное, типизованное описание способов обмена данными;
- операции — абстрактное описание действий, поддерживаемых данным Web-сервисом;
- «порты» — абстрактный набор операций, поддерживаемых одной или более конечными точками;
- связки — спецификация конкретных протоколов и форматов данных для той или иной конечной точки;
- сервис — коллекция связанных точек.
С точки зрения WSDL-документа Web-сервис представляет собой коллекцию портов, которые, в свою очередь, являются коллекцией абстрактных операций и сообщений. Абстракция операций и сообщений позволяет связывать их с различными протоколами и форматами данных типа SOAP, HTTP GET/POST или MIME.
Ниже показан пример WSDL-документа для Web-сервиса, предоставляющего всего один метод.
<?xml version="1.0" encoding="utf-8"?> <definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s0="http://www.abc.com" targetNamespace="http://www.abc.com" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <s:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://www.abc.com"> <s:element name="GreetUser"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Name" nillable="true" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="GreetUserResponse"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="GreetUserResult" nillable="true" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="string" nillable="true" type="s:string" /> </s:schema> </types> <message name="GreetUserSoapIn"> <part name="parameters" element="s0:GreetUser" /> </message> <message name="GreetUserSoapOut"> <part name="parameters" element="s0:GreetUserResponse" /> </message> <message name="GreetUserHttpGetIn"> <part name="Name" type="s:string" /> </message> <message name="GreetUserHttpGetOut"> <part name="Body" element="s0:string" /> </message> <message name="GreetUserHttpPostIn"> <part name="Name" type="s:string" /> </message> <message name="GreetUserHttpPostOut"> <part name="Body" element="s0:string" /> </message> <portType name="Greeting ServiceSoap"> <operation name="SayHello"> <documentation>Greets the user</documentation> <input name="GreetUser" message="s0:GreetUserSoapIn" /> <output name="GreetUser" message="s0:GreetUserSoapOut" /> </operation> </portType> <portType name="Greeting ServiceHttpGet"> <operation name="SayHello"> <documentation>Greets the user</documentation> <input name="GreetUser" message="s0:GreetUserHttpGetIn" /> <output name="GreetUser" message="s0:GreetUserHttpGetOut" /> </operation> </portType> <portType name="Greeting ServiceHttpPost"> <operation name="SayHello"> <documentation>Greets the user</documentation> <input name="GreetUser" message="s0:GreetUserHttpPostIn" /> <output name="GreetUser" message="s0:GreetUserHttpPostOut" /> </operation> </portType> <binding name="Greeting ServiceSoap" type="s0:Greeting ServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="SayHello"> <soap:operation soapAction="http://www.abc.com/GreetUser" style="document" /> <input name="GreetUser"> <soap:body use="literal" /> </input> <output name="GreetUser"> <soap:body use="literal" /> </output> </operation> </binding> <binding name="Greeting ServiceHttpGet" type="s0:Greeting ServiceHttpGet"> <http:binding verb="GET" /> <operation name="SayHello"> <http:operation location="/GreetUser" /> <input name="GreetUser"> <http:urlEncoded /> </input> <output name="GreetUser"> <mime:mimeXml part="Body" /> </output> </operation> </binding> <binding name="Greeting ServiceHttpPost" type="s0:Greeting ServiceHttpPost"> <http:binding verb="POST" /> <operation name="SayHello"> <http:operation location="/GreetUser" /> <input name="GreetUser"> <mime:content type="application/x-www-form-urlencoded" /> </input> <output name="GreetUser"> <mime:mimeXml part="Body" /> </output> </operation> </binding> <service name="Greeting Service"> <documentation>Basic Web Service Example</documentation> <port name="Greeting ServiceSoap" binding="s0:Greeting ServiceSoap"> <soap:address location="http://localhost/WebServices/wsdemo.asmx" /> </port> <port name="Greeting ServiceHttpGet" binding="s0:Greeting ServiceHttpGet"> <http:address location="http://localhost/WebServices/wsdemo.asmx" /> </port> <port name="Greeting ServiceHttpPost" binding="s0:Greeting ServiceHttpPost"> <http:address location="http://localhost/WebServices/wsdemo.asmx" /> </port> </service> </definitions>
Корневым элементом WSDL-документа является элемент <definitions>, который содержит следующие вложенные элементы:
- Types — контейнер для описания типов данных, которые представлены в виде описаний XML Schema (XSD);
- Message — формат для индивидуальной передачи. Каждый метод имеет два типа сообщений — входное и выходное сообщение. Входное сообщение описывает параметры метода, а выходное — возвращаемые методом данные. Средства генерации WSDL-документов фирмы Microsoft, входящие в состав Microsoft .NET, используют следующее соглашение о наименовании сообщений: Имя метода + Протокол + In/Out — например GreetUserSoapIn указывает входное сообщение для протокола SOAP для метода GreetUser;
- PortType — группа сообщений в виде одной логической операции. Для каждого поддерживаемого Web-сервисом протокола существует отдельный элемент PortType. Все операции определяются элементами <operation>, вложенными в элемент PortType;
- Operation — описание одного действия, поддерживаемого Web-сервисом;
- Binding — ассоциация элемента PortType с реализацией. Для каждого поддерживаемого Web-сервисом протокола существует отдельный элемент Binding;
- Service — описание физического местонахождения конечной точки. Для каждого поддерживаемого Web-сервисом протокола существует отдельный элемент Port;
- Port — описание протокола и формата данных для одной конечной точки;
- Data Schema — низкоуровневая типизация параметров сообщения.
WSDL-документы активно используются средствами разработки для генерации прокси-кода, который может выполнять роль переходника между высокоуровневым кодом потребителя Web-сервиса и низкоуровневой реализацией отсылки SOAP-сообщений для вызова методов Web-сервиса и получения результатов работы этих методов.
UDDI
И наконец, четвертой технологией, связанной с Web-сервисами, является спецификация Universal Description, Discovery and Integration (UDDI). Задача UDDI — предоставить механизм для публикации информации о Web-сервисах, а также обеспечить поддержку поиска доступных Web-сервисов. В целом UDDI — это регистрационная система, куда входят набор XML-файлов и ассоциированные схемы, которые содержат описания предоставляемых Web-сервисами услуг. В ближайшее время будут доступны различные UDDI-реестры, способные реплицировать данные между собой.
В качестве примера UDDI-реестров можно привести следующие:
- Реестр фирмы IBM — UDDI Business Registry (https://www-3.ibm.com/services/uddi/protect/registry.html);
- UDDI-реестр фирмы Microsoft (http://uddi.microsoft.com/default.aspx);
- UDDI-реестр фирмы Hewlett-Packard (https://uddi.hp.com/uddi/index.jsp).
Версия UDDI 1 была завершена в сентябре 2000 года — в ее разработке принимало участие около 50 компаний, включая IBM, Microsoft Corp, Ariba, Inc., American Express Co и Merrill Lynch & Co, Inc. Стандарт UDDI разделен на три секции, которые облегчают нахождение информации о Web-сервисах:
- секция «белые страницы» описывает компании и предоставляет контактную информацию и идентификаторы компаний. Поддерживаются такие классификаторы, как North American Industry Classification System (NAICS) и the Standard Industrial Classification (SIC);
- секция «желтые страницы» содержит список бизнес-категорий, к которым относятся компании, включая разделение по географическим признакам, секторам индустрии и продуктам;
- секция «зеленые страницы» содержит информацию о том, как выполняются бизнес-транзакции с каждой компанией, включая информацию о бизнес-процессах и форматах данных.
В июне 2001 года UDDI Project, включающий уже более 200 компаний, завершил работу над UDDI 2 — в спецификации этой версии поддерживались следующие расширения:
- возможность описания комплексных организаций, включая описание структур организаций, подразделений, департаментов, отделов и т.п.;
- улучшенная поддержка международных организаций, в том числе мультиязычная поддержка описаний продуктов и сервисов;
- добавлены дополнительные категории и идентификационные схемы. Корпорации могут использовать специфичные для сегментов рынка категории и идентификаторы для описания продуктов и сервисов;
- более надежные средства поиска, поддержка большего числа параметров поиска, комбинаций критериев поиска;
- более удобные средства моделирования бизнес-процессов;
- помимо этого в UDDI 2 расширена возможность репликации глобальных реестров, и компании HP, IBM и Microsoft объявили о реализации полной поддержки этих возможностей к середине текущего года.
Версия UDDI 3 должна расширить функциональность UDDI 2 — ожидается появление функций для поддержки биржевой информации, а также для более надежной защиты, хранящейся в реестрах информации.
Спецификация UDDI содержит описание программных интерфейсов, позволяющих разработчикам регистрировать Web-сервисы и/или использовать реестр для поиска специфических сервисов. После того как необходимый Web-сервис найден, реестр предоставляет указатель на местонахождение WSDL-документа. Этот процесс показан на следующей иллюстрации.
Отметим, что использование UDDI-реестров является опциональным. Компании, которые желают ограничить доступ к собственным Web-сервисам, могут не публиковать их во внешних реестрах, использовать внутрикорпоративные реестры или вообще отказаться от UDDI-реестров.
Возвращаясь к программным интерфейсам, отметим, что они разделяются на две категории — запрос (inquiry) и публикация (publishing). Обращение к реестрам происходит в виде SOAP-сообщений, посылаемых специфичному Web-сервису. Примерами адресов, где расположены такие Web-сервисы, могут быть:
В следующей таблице показаны основные методы, доступные в программных интерфейсах UDDI.
Для вызова функций API мы посылаем SOAP-сообщения с определенным содержимым параметров. Например, для поиска компании ABC Supply мы должны послать следующее SOAP-сообщение:
<find_business generic='1.0' xmlns='urn:uddi-org:api'> <name>ABC Supply</name> </find_business>
SOAP-ответ от UDDI-реестра содержит все компании, соответствующие критерию запроса, а также реализуемые ими сервисы. Эта информация возвращается в виде XML-структуры, называемой businessInfos. Помимо этой структуры UDDI API использует и другие структуры данных — наиболее важные из них показаны выше.
Структура businessEntity представляет данные о компании и содержит набор структур businessService, описывающих сервисы, предоставляемые данной компанией. Каждый сервис может быть доступен различными способами. Например, это может быть Web-сервис, управляемый SOAP-сообщениями, Web-форма или просто телефонный номер. Для того чтобы описать способы доступа к сервису, используется структура bindingTemplate, которая связана со структурой tModel.
Более подробно о протоколе UDDI и поддерживаемых им API и структурах данных можно узнать по адресу: http://www.uddi.org/.
Дополнительные стандарты и технологии для Web-сервисов
осле того как мы рассмотрели базовые технологии, на которых основаны Web-сервисы, давайте кратко остановимся на дополнительных технологиях и стандартах, предлагаемых различными фирмами.
ebXML
ebXML (Electronic Business using eXtensible Markup Language) — это совместный проект UN-CEFACT и OASIS, представляющий собой описание открытой, основанной на XML инфраструктуры для обеспечения возможностей глобального использования электронной бизнес-информации.
Более подробно о ebXML см. http://www.oasis-open.org/ или http://www.ebxml.org/.
XML Digital Signatures (XML-DSIG)
XML-DSIG — это совместный проект W3C и IETF, в котором описаны правила и синтаксис для создания цифровых подписей в XML-документах.
Дополнительная информация доступна по адресу: http://www.w3.org/TR/xmldsig-core/.
Security Assertions Markup Language (SAML)
SAML — это спецификация, описывающая ряд XML-элементов, позволяющих подтвердить, что именно автор подписал данный XML-документ, что пользователь имеет доступ к базе данных и т.п.
Дополнительная информация доступна по адресу: http://www.oasis-open.org/committees/security/index.shtml.
Extensible Key Management Specification (XKMS)
XKMS устанавливает протоколы для определения и регистрации ключей и использования их в составе XML-документов.
Дополнительная информация доступна по адресу: http://www.w3.org/TR/xkms/.
Web Services Flow Language (WSFL)
WSFL — это язык, позволяющий указать, каким образом Web-сервисы могут быть объединены для описания бизнес-процессов.
Дополнительная информация доступна по адресу: http://www-4.ibm.com/software/solutions/webservices/pdf/WSFL.pdf.
Помимо этого следует упомянуть архитектуру Global XML Web Services Architecture (http://msdn.microsoft.com/webservices/), предлагаемую Microsoft и IBM и базирующуюся на спецификациях:
- WS-Inspection — XML-формат для поиска доступных сервисов на том или ином
узле.
Дополнительная информация доступна по адресу: http://msdn.microsoft.com/ws/2001/10/Inspection/;
- WS-Security — расширение SOAP, описывающее, как в состав SOAP-сообщений
должны интегрироваться цифровые подписи и как должна обеспечиваться поддержка
ключей и криптографии. Эта спецификация была разработана Microsoft, IBM и
VeriSign, Inc., и ее первая версия была опубликована в апреле нынешнего года.
Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-security.asp;
- WS-License — описывает, как можно использовать стандартные форматы лицензий
(сертификаты X.509, Kerberos и т.п) совместно с WS-Security.
Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-license.asp;
- WS-Routing — расширение SOAP для посылки асинхронных сообщений по протоколам
TCP, UDP, HTTP.
Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-routing.asp;
- WS-Referral — расширение SOAP для перенаправления сообщений с динамической
конфигурацией. Это расширение позволяет, например, эффективно переложить часть
или всю обработку запроса на другие сервисы.
Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-referral.asp.
Заключение
этом обзоре мы рассмотрели ключевые технологии для Web-сервисов — eXtensible Markup Language (XML), Simple Object Access Protocol (SOAP), Web Services Description Language (WSDL) и Universal Description, Discovery and Integration (UDDI), познакомились с их назначением и получили представление об их роли в жизнеобеспечении Web-сервисов. Мы также рассказали о дополнительных стандартах и технологиях, связанных с Web-сервисами, и привели их краткие описания.
Web-сервисы — это развивающаяся технология, и многие стандарты, которые мы здесь обсудили, будут со временем меняться. Тем не менее успешное внедрение и использование первого поколения Web-сервисов как для создания «приложений как сервисов», так и для решения корпоративных задач показывает, что базовые технологии, лежащие в основе Web-сервисов, выбраны и разработаны с учетом необходимых требований. Также важно отметить, что ни одна технология для обеспечения Web-сервисов не должна быть монополизирована какой-либо одной компанией — только в этом случае можно гарантировать успех Web-сервисов.
КомпьютерПресс 6'2002