Главная » Java, Web, XML » Типы данных SOAP

0

В SOAP-посланиях передаются данные самых разных типов: числа, даты, строки символов, массивы, структуры. Определение типов этих данных выполняется, как обычно, в схемах XML. Схема может быть записана любым способом, но чаще всего применяется язык XSD, который мы разобрали в главе 1. Типы, определенные в схеме, заносятся в пространство имен, идентификатор которого служит значением атрибута encodingstyle. Атрибут encodingstyle может появиться в любом элементе SOAP-послания, но версия SOAP 1.2 запрещает его появление в корневом элементе Указанное атрибутом encodingstyle пространство имен будет известно в том элементе, в котором записан атрибут, и во всех вложенных в него элементах. Конечно, какие-то из вложенных элементов могут изменить пространство имен своим атрибутом encodingstyle.

Стандартное пространство имен, в котором расположены имена типов данных SOAP 1.1, называется http://schemas.xmlsoap.org/soap/encoding/. У текущей черновой версии SOAP 1.2 идентификатор пространства имен —

Идентификатор того или иного пространства имен, в котором определены типы данных, обычно получает префикс enc или SOAP-ENC. Вот обычное описание наиболее часто применяемых пространств имен:

<scneelem

xmlns:enc="http: //www.w3.org/2002/06/scap-encocling,, env:encodingStyle="http://www.w3.org/2002/06/soap-encoding" xmlns:env="http://www.w3.org/2002/06/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Ниже мы будем считать, что эти описания уже сделаны. Для краткости будем называть пространство имен типов данных SOAP просто

В основном типы данных, определенные в пространстве имен’ епс, совпадают с типами данных языка XSD, описанными в главе 1. Это не случайно. Создатели протокола SOAP намеревались просто взять имена типов языка XSD, долго ждали окончания работы над этим языком, не дождались — и определили свое пространство имен, включив в него черновую версию языка XSD. В частности, полностью совпадают простые типы: числа, даты, строки, логические значения.

Интересно, что в пространстве имен епс описаны специальные элементы XML, типы которых — простые типы XSD. Имена этих элементов совпадают с именами соответствующих простых типов XSD. Например, тип элемента <enc:int> — это тип целых чисел int, определенный в языке XSD. Элемент можно использовать так:

<enc:int>37</enc:int>

У этого элемента фактически нет имени, он только показывает, что в его теле следует записывать целое число. Такие элементы удобно использовать в массивах. Для того чтобы на такой элемент можно было сослаться, определен атрибут id:

<enc:int id="age">37</enc:int>

Атрибут id, определенный вместе с элементом <enc:int>, задает имя элемента, по которому можно сослаться на элемент атрибутом ref следующим образом:

<personAge ref="#age" />

Знак номера # означает ссылку на имя, определенное в другом элементе.

Атрибут ref можно использовать, как в языке HTML, для ссылок на другие документы. Например:

<person>

<пате>Иванов</пате> <address ref="http://some.com/addr.xml#Ivanov" />

</person>

В версии SOAP 1.1 атрибут ref назывался href.

Разумеется, для указания типа элемента можно использовать обычную для документов XML конструкцию xsi: type (см. главу Т), например, определить элемент

<age xsi:type="xsd:int">37</age>

или передать комплексное число 2.25+3. 4 6i так:

<argO xsi:type="complex">

<re xsi:type="xsd:double">2.25</re> <im xsi:type="xsd:double">3. 4 6</im>

</argO>

Элементы XML, соответствующие простым типам XSD, удобно применять для описания элементов массивов.

Массивы

В пространстве имен                                                                        определен

тип массива Array. Этот тип не определяет ни количество элементов массива, ни их тип. Все это надо уточнить позднее. В схеме, описывающей SOAP-послание, можно описать элемент типа массив, например, так:

<element name="arr" type="enc:Array" />

После этого в SOAP-послании можно определить конкретный массив:

<arr

<item>HBaHOB</item> <item>rieTpoB</item> < i t еш> Си доров < / i t em>

</arr>

Можно сделать все определение целиком прямо в SOAP-послании: <arr xsi:type="enc:Array" enc:arrayType="xsd:string[3]">

<item>HBaHOB</item> <item>IIeTpoB</item>

<item>CwflopoB</item> </arr>

Как видно из этих примеров, при определении массива атрибутом arrayType надо задать тип массива и количество его элементов. В одном массиве можно записать элементы разных типов. Типы элементов массива должны быть подтипами типа массива или совпадать с ним. Тип массива может быть любым, в том числе снова массивом, что отмечается квадратными скобками, например, тип "массив из пяти целых чисел" записывается как int [ 5 ], тип "неограниченный двумерный массив целых чисел" — int [, ] и так далее. Вот определение массива из десяти элементов, каждый элемент которого — двумерный массив целых чисел, число строк и столбцов которого не определено:

<tabl xsi:type="enc:Array" enc:arrayType="xsd:int[,] [10]">

А вот массив, число элементов которого неизвестно, но каждый элемент — массив из двух строк:

<list xsi:type="enc:Array" enc:arrayType="xsd:string[2][]">

Если все размерности массива уже известны, то их можно записать в определении массива:

<tabl xsi:type="enc:Array" enc:arrayType="xsd:int[15,10]">

Элементы многомерных массивов записываются построчно: сначала перечисляются элементы первой строки, потом второй и так далее.

Имена элементов массива (в примере, приведенном выше, повторяется имя item), не имеют никакого значения. Поэтому удобно применять элементы XML, соответствующие простым типам XSD, тем более, что элементы одного и того же массива могут быть разных типов. Например:

<addr enc:arrayType="xsd:anySimpleType[2]">

<епс: з^1пд>Яблочная, 23</enc: string> <enc:int>2347 65</enc:int>

</addr>

При разборе массива его элементы отыскиваются по индексу. Начальный индекс равен нулю. Впрочем, в версии SOAP 1.1 допускаются массивы, индексы которых начинаются с положительного числа. Такие массивы определяются с атрибутом off set следующим образом:

<arr xsi:type="env:Array"

enc:arrayType="xsd:string[5]" enc:offset="[2]">

citeitD-Элемент с индексом 3</item> <item>Элемент с индексом 4</item>

</arr>

В версии SOAP 1.1 допускаются даже массивы, не все                        которых

определены ("массивы с дырками"). Скажем, мы можем определить массив из 10 элементов, но задать в нем только. элементы с индексами 2 и 4. Это выполняется атрибутом position, например, определяем двумерный массив из 100 элементов, но записываем только два элемента:

<arr xsi:type="enc:Array" enc:arrayType="xsd:string[10,10]">

<item enc:position="[2,5]">Элемент с индексами [2,5]</item> <item enc:position="[5,3]">Элемент с индексами [5,3]</item>

</arr>

Версия SOAP 1.2 запрещает эти вольности, поскольку они сильно затрудняют разбор массива сервером. В этой версии индексы массива всегда начинаются с нуля и все элементы массива должны быть записаны явно.

Структуры

Структуры определяются гораздо проще массивов. Поля структуры записываются как элементы XML, вложенные в структуру. Они различаются по именам своих элементов XML. Все имена, разумеется, должны быть различны. Например:

<person>

<пате>Иван</пате>

<secondname>neTpoBH4</secondname>

<lastname>CnflopoB</lastname>

</person>

Типы полей структуры могут быть какими угодно, в частности, снова структурами или массивами. Например, следующий элемент       будет структурой, поле которой — массив:

<Воок>

<title>3cxn0T0fi TeneHOK</title> <authors>

<пате>Илья Ильф</пате> <паше>Евгений Петров</пате>

</authors>

</Воок>

но следующий элемент <аВоок>: <аВоок>

<title>3cxnoToii теленок</^1;1е> <author>HnbH Ильф</аи"Ыюг> <author>EBreHHti FIeTpoB</author>

</aBook>

не будет структурой, поскольку у вложенных в него элементов совпадают имена. Это просто элемент XML какого-то сложного типа.

Введение новых типов

Итак, в пространстве имен епс уже определено множество простых типов, совпадающих с простыми типами языка XSD, и два сложных типа — массивы и структуры. Этих типов обычно хватает для работы с большинством Web-служб. При необходимости ввести новые типы, следует определить их в какой-либо схеме, например, на языке XSD. Их имена надо записать в новое пространство имен, а идентификатор этого пространства имен сделать значением атрибута

В запросах клиента и ответах сервера новые типы обычно выражаются классами Java. Преобразование классов Java в типы, определенные схемой XML, называется в протоколе SOAP сериализацией (serialization), обратное преобразование называется десериализацией (deserialization). После определения новых типов и классов Java, надо разработать методы сериализации и десе- риализации этих типов и классы, содержащие их. Затем клиенту и серверу SOAP надо указать соответствие классов Java определенным типам XML. Это выполняется разными способами, чаще всего пишутся конфигурационные файлы или описание на языке WSDL.

В результате получится специальный программный код, который надо переносить на все Web-службы, использующие новые типы, а также встраивать во все клиентские приложения. Это противоречит основному принципу Web Services — повсеместной доступности Web-услуг. Поэтому не стоит увлекаться введением новых типов данных в свои Web-службы.

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии