2003 г
Предварительное знакомство с WS-I Basic Profile 1.1
Дата: 16-09-2003
Автор: Аниш Кармаркар (Anish Karmarkar)
Перевод: Intersoft Lab
Введение
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.