Журнал ВРМ World

Мировая история развития технологий управления эффективностью бизнеса – обзоры зарубежных публикаций

Предварительное знакомство с WS-I Basic Profile 1.1

Наши постоянные читатели, разумеется, помнят от том, что мы сообщали о
выходе первой спецификации международная организация WS-I (Web Services
Interoperability Organization, Организация по развитию возможности
взаимодействия Web-сервисов). Первая статья рубрики "Технологии XML" знакомит
со следующей редакцией этого стандарта - с Basic Profile 1.1.

Введение

12-го августа 2003 г. представители организации WS-I (Web Services Interoperability Organization, Организация по развитию возможности взаимодействия Web-сервисов) объявили о выходе окончательной версии спецификации Basic Profile 1.0 - набора рекомендаций о том, как использовать стандарты Web-сервисов, чтобы улучшить совместимость. Для разработчиков, пользователей и поставщиков Web-сервисов и инструментов Web-сервисов это большой шаг вперед в достижении совместимости в стремительно развивающемся мире Web-сервисов. Однако, чем еще занималась эта организация?

Члены консорциума WS-I признают, что Basic Profile 1.0 - это только начало, предстоит долгий путь, пока Web-сервисы и их совместимость получат повсеместное распространение. В целях ускорения процесса признания Web-сервисов и продвижения принципа совместимости перед Рабочей группой Basic Profile, которая разработала одноименный документ, была поставлена задача по написанию следующей версии спецификации, в которой будет определено, как присоединять вложения (attachment). Так, в уставе группы записано:


"Рабочей группе поручено разрешить вопрос о включении поддержки вложений в будущую редакцию Basic Profile, которая по причине минимального количества изменений будет именоваться Basic Profile 1.1. Она должна опираться на Basic Profile 1.0, а также:
Примечание W3C "SOAP-сообщения с вложениями" (SOAP Messages with Attachments) от 11 декабря 2000г."

Итак, спецификация Basic Profile 1.1, как следует из ее названия, это следующая версия Basic Profile 1.0. Ее основу составляет Basic Profile 1.0, в нее также добавляется поддержка Примечания "SOAP-сообщения с вложениями" (SOAP Messages with Attachments (SwA)) и Раздела 5 "Соединение MIME " (MIME Binding) из Примечания WSDL 1.1 (Web Services Description Language, Язык описания Web-сервисов). В рамках работы над этим документом Рабочие группы WS-I занимаются разработкой примеров приложений и инструментов тестирования для данной спецификации. Благодаря этому, на момент публикации окончательного варианта стандарта он получит необходимую апробацию и будет "отлажен". Как и нынешняя версия Basic Profile, эта редакция спецификации будет выпущена вместе с примерами приложений и инструментами тестирования.

Эта статья опирается на последний вариант Рабочей версии Basic Profile 1.1, написанием которой Рабочая группа занимается с января 2003г. В ходе работы над этим проектом члены группы выявили более 70 технических вопросов, которые требуют разрешения. "За бортом" осталось очень незначительное число вопросов. Повторимся, что в этой статье рассматривается Рабочая версия - в процессе разработки стандарта в некоторые ее разделы могут (и, наверняка, будут) внесены некоторые изменения.

Включения, SwA и совместимость

По мере того, как Web-сервисы получает все большие применение в "серьезных" приложениях, важным становится наличие стандарта, который описывал бы совместимые вложения и согласовывался бы с спецификациями SOAP 1.1 и WSDL 1.1. Существует несколько причин, по которым требуется применять вложения при передаче больших объемов данных: как бинарных, так и других документов XML. К достоинствам использования вложений можно отнести небольшой размер сообщений, менее строгие требования к памяти, уменьшение времени обработки (отсутствует необходимость преобразовывать бинарные данные в base-64) и, самое главное, перемещение данных потоком (streaming). Вложения позволяют приложениям использовать соответствующие API (интерфейсы прикладного программирования) для обработки данных в потоковом режиме. Это существенно повышает производительность при пересылке в SOAP-конверте объектов BLOB и CLOB из базы данных приложения. Преимущества вложений подробно описаны в следующих документах: SwA, "SOAP 1.2 Возможность вложений" (SOAP 1.2 Attachment Feature), "XML, SOAP и бинарные данные" (XML, SOAP and Binary Data), "Рекомендуемое приложение Infoset к SOAP-приложениям с вложениями" (Proposed Infoset Addendum to SOAP Messages with Attachments) и "Механизм оптимизации передачи SOAP-сообщений" (SOAP Message Transmission Optimization Mechanism). Рабочая группа XMLP (XML Protocol) также занимается разработкой технологии вложений для SOAP 1.2.

Basic Profile 1.0 способствует поддержанию принципа совместимости на базовом уровне - SOAP 1.1, WSDL 1.1, UDDIv2 (см. "Спецификация интерфейса прикладного программирования для UDDI, версия 2.04" (UDDI Version 2.04 API Specification) и "Справочник структуры данных для UDDI версия 2.03" (UDDI Version 2.03 Data Structure Reference)) и т.д. Однако, единственное, что не было учтено в Basic Profile 1.0, это поддержка вложений. А ведь использование вложений влияет на совместимость Web-сервисов с точки зрения пакетирования (packaging), форматирования (formatting) и сериализации (serialization).

Наиболее широко применяемая и признанная технология включений - это MIME (Multipurpose Internet Mail Extensions, Многоцелевые расширения электронной почты в сети Internet). SwA комбинирует MHTML и CID для указания частей MIME в SOAP. В Basic Profile 1.1 в качестве технологии вложений была выбрана SwA, а для описания SwA - Раздел 5 "MIME Binding" WSDL 1.1. В Basic Profile 1.1, как и в предыдущей версии этого стандарта, уточняется, корректируется и выделяется ряд соответствующих спецификаций с целью повышения совместимости и устранения двусмысленности. То есть рассматривается проблема, с которой сталкивались разработчики и пользователи Web-сервисов при манипулировании большими объемами бинарных данных и их передаче в конвертах SOAP 1.1.

Направленность Basic Profile 1.1 совпадает с позицией, избранной Рабочей группой XMLP в отношении вложений для SOAP 1.2, как записано в Рабочей версии спецификации "Механизм оптимизации передачи SOAP-сообщений" (SOAP Message Transmission Optimization Mechanism (MTOM)). Оба документа используют MIME и опираются на SwA. MTOM даже "идет дальше": он включает вложения как часть Infoset (поскольку SOAP 1.2 строится на Infoset), то есть модель обработки SOAP 1.2 также становится применимой к вложениям. Передаваемые сообщения в обоих случаях будут очень похожи. MTOM - это эволюционный подход в технологии вложений, подобный переходу от SOAP 1.1 к SOAP 1.2.

Описание вложений

Как указано в уставе Рабочей группы Basic Profile, добавление в разрабатываемый стандарт положения о поддержке вложений предусматривает обратную совместимость. Это означает, что все артефакты Basic Profile 1.0 (DESCRIPTION, MESSAGE, INSTANCE и т.д.) будут также совместимы и с Basic Profile 1.1. Для этого в Basic Profile 1.0 были удалены и изменены требования, согласно которым соединение (binding) ограничивается только SOAP HTTP, то есть теперь стало допустимым соединение SOAP HTTP, либо соединение MIME.

Хотя SwA довольно надежная спецификация, Раздел 5 "MIME Binding" Примечания WSDL 1.1 не совсем точно определен, что ведет к проблемам с совместимостью. Basic Profile 1.1 связывает этот раздел с SwA. Соединения MIME трактуются как нечто отличное от SwA. В Basic Profile 1.1 также исправлены двусмысленности соединений MIME, а также ошибки ("баги") в схеме соединений MIME.

Приведенный ниже фрагмент кода WSDL 1.1 демонстрирует, что можно делать с помощью Basic Profile 1.1 для стиля rpc/literal (заметим, что префиксы пространства имен привязаны к тем же самым универсальным идентификаторам ресурса, как и в Разделе 1.2 WSDL 1.1):

<wsdl:message name="msg-in">
    <wsdl:part name="photo-reference" type="xsd:anyURI"/>
    <wsdl:part name="photo-attachment" type="xsd:base64Binary"/>
</wsdl:message>

<wsdl:message name="msg-out">
    <wsdl:part name="result" type="xsd:string"/>
</wsdl:message>

<wsdl:portType name="my-portType">
    <wsdl:operation name="my-operation">
        <wsdl:input message="tns:msg-in"/>
        <wsdl:output message="tns:msg-out"/>
    </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="my-binding" type="tns:my-portType">
    <soap:binding style="rpc" 
        transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="my-operation">
        <soap:operation soapAction="http://example.com/soapaction"/>
        <wsdl:input>
            <mime:multipartRelated>
                <mime:part>
                    <soap:body parts="photo-reference"
                        use="literal" 
                        namespace="http://example.com/some-namespace"/>
                </mime:part>
                <mime:part>
                    <mime:content part="photo-attachment"
                        type="application/octetstream"/>
                </mime:part>
            </mime:multipartRelated>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"
                namespace="http://example.com/some-namespace"/>
        </wsdl:output>
    </wsdl:operation>
 </wsdl:binding>

В этом фрагменте часть (part) photo-reference входного сообщения привязана к телу SOAP (SOAP Body), а часть (part) photo-attachment - к отдельной части (part) MIME. Ниже приведен пример входного сообщения для соединения my-binding:

MIME-Version: 1.0
Content-Type: Multipart/Related; boundary=boundary; type=text/xml;
        start="<my-root-part@example.com>"
Content-Description: This is an optional message description.

--boundary
Content-Type: text/xml; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Content-ID: <my-root-part@example.com>

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Body xmlns:types="http://example.com/some-namespace">
        <types:my-operation>
            <photo-reference>cid:my-cool-photo@example.com</photo-reference>
        </types:my-operation>
    </env:Body>
</env:Envelope>

--boundary
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <my-cool-photo@example.com>

...binary photograph...
--boundary--

Заметим, что входное сообщение привязано к соединению MIME, а выходное - к соединению SOAP HTTP по Basic Profile 1.0. Basic Profile 1.1 допускает подобное смешение. На самом деле Basic Profile 1.1 "идет дальше" - если используемое соединение MIME, а тело SOAP (SOAP Body) - единственная перечисленная часть MIME, отправитель может отправить это сообщение, применяя соединение SOAP HTTP (если нет вложений) или соединение MIME.

Ниже приведен эквивалентный пример с такими же входным и выходным сообщениями. В этом фрагменте используется стиль document/literal вместо rpc/literal (заметим, что префикс types пространства имен привязан к URI (Uniform Resource Identifier, Универсальный идентификатор ресурса) для пространства имен http://example.com/some-namespace):

    <wsdl:types>
    <schema targetNamespace="http://example.com/some-namespace"
            xmlns="http://www.w3.org/2000/10/XMLSchema"
            elementFormDefault="unqualified">
        <element name="my-operation">
            <complexType>
                <sequence>
                    <element name="photo-reference" type="xsd:anyURI"/>
                </sequence>
            </complexType>
        </element>
        <element name="my-operationResponse">
            <complexType>
                <sequence>
                    <element name="result" type="xsd:string"/>
                <sequence>
            </complexType>
        </element>
    </schema>
</wsdl:types>

<wsdl:message name="msg-in-doc">
    <wsdl:part name="photo-reference-wrapper"
        element="types:my-operation"/>
    <wsdl:part name="photo-attachment"
        type="xsd:base64Binary"/>
</wsdl:message>
<wsdl:message name="msg-out-doc">
    <wsdl:part name="result-wrapper"
        element="types:my-operationResponse"/>
</wsdl:message>

<wsdl:portType name="my-portType-doc">
    <wsdl:operation name="my-operation-doc">
        <wsdl:input message="tns:msg-in-doc"/>
        <wsdl:output message="tns:msg-out-doc"/>
    </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="my-binding-doc" type="tns:my-portType-doc">
    <soap:binding style="document"
        transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="my-operation-doc">
        <soap:operation soapAction="http://example.com/soapaction"/>
        <wsdl:input>
            <mime:multipartRelated>
                <mime:part>
                    <soap:body parts="photo-reference-wrapper"
                        use="literal"/>
                </mime:part>
                <mime:part>
                    <mime:content part="photo-attachment"
                        type="application/octetstream"/>
                </mime:part>
            </mime:multipartRelated>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" />
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>

Указание вложений

Рассмотренные примеры позволяют Web-сервису описывать вложения, но это описание ничего не говорит о том, как указывать вложения из конверта SOAP (SOAP Envelope), а это самый обычный случай использования. Рассмотрим ситуацию, когда бинарные данные слишком велики, чтобы их встраивать в конверт SOAP. SwA позволяет передавать данные в качестве вложения, но их необходимо указывать из конверта SOAP. Благодаря такому подходу для более высоких уровней приложения неважно, встроены данные или отправлены как вложение. (Например, на Java для этого можно было бы воспользоваться javax.activation.DataHandler).

Basic Profile 1.1 решает проблему описания отношения указатель-указание, определяя тип swaRef во (временном) пространстве имен http://ws-i.org/profiles/basic/1.1/xsd (этот тип образован путем ограничения типа xsd:anyURI):

<xsd:schema targetNamespace="http://ws-i.org/profiles/basic/1.1/xsd"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="swaRef">
        <xsd:restriction base="xs:anyURI" />
    </xsd:simpleType>
</xsd:schema>

Basic Profile 1.1 требует, чтобы значение этого типа было разрешено в пакете MIME, то есть URI, который является значением этого типа в реальном документе, должен разыменовывать часть MIME в том же самом пакете MIME.

Благодаря этому отношения между указателем и указанием становится доступным для инструментов, которые смогут сгенерировать артефакты кода с богатой семантикой (например, сгенерировать ориентированные на поток интерфейсы для доступа к вложенным данным). Приложения могут использовать другие механизмы для выражения подобных отношений указатель-указание. Тип swaRef предоставляет унифицированный механизм идентификации указаний, которые ссылаются на вложения, и, следовательно, способствует обеспечению совместимости.

В рассмотренном выше примере со стилем rpc/literal тип части photo-reference входного сообщения может быть изменен на swaRef. Аналогично, для примера с document/literal тип элемента photo-reference в разделе wsdl:types также может быть изменен на swaRef. Из-за того, что элемент photo-reference в конверте SOAP (SOAP Envelope) указывает на часть MIME в том же самом пакете MIME, можно снова говорить о факте доступности в этом описании WSDL. Пример rpc/literal может быть модифицирован для использования этого нового типа следующим образом (заметим, что префикс bp11 пространства имен привязан к URI для пространства имен http://ws-i.org/profiles/basic/1.1/xsd):

<wsdl:message name="msg-in">
    <wsdl:part name="photo-reference" type="bp11:swaRef"/>
    <wsdl:part name="photo-attachment" type="xsd:base64Binary"/>
</wsdl:message>

<wsdl:message name="msg-out">
    <wsdl:part name="result" type="xsd:string"/>
</wsdl:message>

<wsdl:portType name="my-portType">
    <wsdl:operation name="my-operation">
        <wsdl:input message="tns:msg-in"/>
        <wsdl:output message="tns:msg-out"/>
    </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="my-binding" type="tns:my-portType">
    <soap:binding style="rpc" 
        transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="my-operation">
        <soap:operation soapAction="http://example.com/soapaction"/>
        <wsdl:input>
            <mime:multipartRelated>
                <mime:part>
                    <soap:body parts="photo-reference"
                        use="literal"
                        namespace="http://example.com/some-namespace"/>
                </mime:part>
                <mime:part>
                    <mime:content part="photo-attachment"
                        type="application/octetstream"/>
                </mime:part>
            </mime:multipartRelated>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"
                namespace="http://example.com/some-namespace"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>

Теперь процессор WSDL, обрабатывающий этот фрагмент кода WSDL, знает, что URI в теле SOAP (SOAP Body) является указанием на часть MIME в том же самом пакете MIME, и может генерировать соответствующие интерфейсы прикладного программирования для доступа к бинарным данным, которые отправляются как отдельная часть MIME. Ранее, когда тип swaRef еще не использовался, процессор WSDL не знал, разрешится ли значение URI в сообщении SOAP локально и разрешится ли вообще.

Заключение

Совместимые вложения - одна из функциональностей, которая столь необходима разработчикам и пользователям Web-сервисов. Рабочая группа Basic Profile решила эту проблему, включив SwA в Basic Profile 1.1, устранив двусмысленность и заполнив пробел в существующих спецификациях. Более того, Basic Profile 1.1 также позволяет средствам связывания языков генерировать соответствующие интерфейсы прикладного программирования, чтобы полностью реализовать возможности вложений.

Благодарности

Автор хотел бы поблагодарить Эрика Райковича (Eric Rajkovic) и Умита Ялчиналпа (Umit Yalcinalp) за просмотр данного материла и ценные замечания.

Ресурсы

Спецификация организации WS-I "BasicProfile Version 1.0a", Кит Бэллинджер (Keith Ballinger), Дэвид Энебуске (David Ehnebuske), Мартин Гуджин (Martin Gudgin), Марк Ноттингем (Mark Nottingham), Прасад Йендлури (Prasad Yendluri), от 8 августа 2003г.

"Устав Рабочей группы Web Services Basic Profile" организации WS-I, Том Гловер (Tom Glover), Кристофер Фэррис (Christopher Ferris), Кристофер Курт (Christopher Kurt), Кит Бэллинджер (Keith Ballinger), от 21 января 2003г.

Запрос на комментарии комитета по инженерным вопросам Internet (IETF) "Универсальные локаторы ресурса Контент-ID и Сообщение-ID" ("Content-ID and Message-ID Uniform Resource Locators"), Э. Левинсон (E. Levinson), март 1997г.

Спецификация компании Sun "Среда ативизации JavaBeans, версия 1.0а" ("JavaBeans Activation Framework Specification Version 1.0a"), Барт Кэлдер (Bart Calder), Билл Шэннон (Bill Shannon), от 27 мая 1999г.

Запрос на комментарии комитета по инженерным вопросам Internet (IETF) "MIME инкапсуляция обобщенных документов, таких как HTML (MHTML)" ("MIME Encapsulation of Aggregate Documents, such as HTML (MHTML)"), Дж. Пэлм (J. Palme), А. Хопменн (A. Hopmann), Н. Шелнесс (N. Shelness), март 1999г.

Рабочая версия спецификации консорциума W3C "Механизм оптимизации передачи SOAP-сообщений" ("SOAP Message Transmission Optimization Mechanism"), Ноа Мендельсон (Noah Mendelsohn), Марк Ноттингем (Mark Nottingham), Херве Руеллан (Herve Ruellan), от 21 июля 2003г.

Черновой проект "Рекомендуемое приложение Infoset к SOAP-приложениям с вложениями" ("Proposed Infoset Addendum to SOAP Messages with Attachments"), Адам Босуорф (Adam Bosworth), Дон Бокс (Don Box), Мартин Гуджин (Martin Gudgin), Марк Джоунз (Mark Jones), Франц-Джозеф Фриц (Franz-Josef Fritz), Эми Леуис (Amy Lewis), Жан-Жак Моро (Jean-Jacques Moreau), Марк Ноттингем (Mark Nottingham), Дэвид Орчард (David Orchard), Херве Руеллан (HervГ© Ruellan), Джеффри Шлиммер (Jeffrey Schlimmer), Фолькер Вайхерс (Volker Wiechers), документ в стадии оформления.

Статья "XML, SOAP и бинарные данные" ("XML, SOAP and Binary Data"), Адам Босуорф (Adam Bosworth), Дон Бокс (Don Box), Мартин Гуджин (Martin Gudgin), Марк Ноттингем (Mark Nottingham), Дэвид Орчард (David Orchard), Джеффри Шлиммер (Jeffrey Schlimmer), от 26 февраля 2003г.

Примечание консорциума W3C "Простой протокол доступа к объектам, 1.1" ("Simple Object Access Protocol (SOAP) 1.1"), Дон Бокс (Don Box), Дэвид Энебуске (David Ehnebuske), Гопал Какивайа (Gopal Kakivaya), Эндрю Леймен (Andrew Layman), Ноа Мендельсон (Noah Mendelsohn), Генрих Фристик Нилсен (Henrik Frystyk Nielsen), Сэтиш Тэтт (Satish Thatte), Дэйв Уайнер (Dave Winer), от 8 мая 2000г.

Рекомендация консорциума W3C "SOAP, версия 1.2, Часть 1: Структура обмена сообщениями" ("SOAP Version 1.2 Part 1: Messaging Framework"), Мартин Гуджин (Martin Gudgin), Марк Хэдли (Marc Hadley), Ноя Мендельсон (Noah Mendelsohn), Жан-Жак Моро (Jean-Jacques Moreau), Генрих Фристик Нилсен (Henrik Frystyk Nielsen), от 24 июня 2003г.

Рекомендация консорциума W3C " SOAP версия 1.2, Часть 2: Дополнения" ("SOAP Version 1.2 Part 2: Adjuncts"), Мартин Гуджин (Martin Gudgin), Марк Хэдли (Marc Hadley), Ноя Мендельсон (Noah Mendelsohn), Жан-Жак Моро (Jean-Jacques Moreau), Генрих Фристик Нилсен (Henrik Frystyk Nielsen), от 24 июня 2003г.

Рабочий версия спецификации консорциума W3C "SOAP 1.2 Возможность вложений" ("SOAP 1.2 Attachment Feature"), Генрих Фристик Нилсен (Henrik Frystyk Nielsen), Херве Руеллан (Herve Ruellan), от 24 сентября 2002г.

Примечание консорциума W3C "SOAP-сообщения с вложениями" ("SOAP Messages with Attachments"), Джон Дж. Бартин (John J. Bartin), Сэтиш Тэтт (Satish Thatte), Генрих Фристик Нилсен (Henrik Frystyk Nielsen), от 11 декабря 2000г.

Спецификация комитета UDDI организации OASIS "Спецификация интерфейса прикладного программирования для UDDI, версия 2.04" ("UDDI Version 2.04 API Specification"), Том Беллвуд (Tom Bellwood) (редактор), от 19 июля 2002г.

Спецификация комитета UDDI организации OASIS "Справочник структуры данных для UDDI версия 2.03" ("UDDI Version 2.03 Data Structure Reference"), Клос фон Риген (Claus von Riegen) (редактор), от 19 июля 2002г.

Web-сайт Организации по развитию возможности взаимодействия Web-сервисов (Web Services Interoperability Organization).

Примечание консорциума W3C "Язык описания Web-сервисов 1.1" ("Web Services Description Language (WSDL) 1.1", Эрик Кристенсен (Erik Christensen), Франциско Курбера (Francisco Curbera), Грег Мередит (Greg Meredith), Саньива Веераварана (Sanjiva Weerawarana), от 15 марта 2001г.

Web-страница Рабочей группы консорциума W3C XML Protocol.

Автор: Аниш Кармаркар (Anish Karmarkar)