xsi: введите в буквальном формате doc - PullRequest
1 голос
/ 20 августа 2010

Хотя в обычных обстоятельствах xsi: type не появляется в буквальном сообщении SOAP WSDL, все еще есть случаи, когда информация о типе необходима и она появится - например, в полиморфизме. Если API ожидает, что базовый тип и экземпляр расширения отправлены, тип этого экземпляра должен быть предоставлен для правильной десериализации объекта.

Мой вопрос: Насколько правильно отправлять xsi: type в формате doc / literal? Можно ли найти официальный ответ (положительный / отрицательный)? Что ты думаешь?

пример:

<Device xsi:type="ns1:DeviceID">value</Device>

вместо

<Device>value</Device>

Ответы [ 2 ]

0 голосов
/ 13 февраля 2011

Я думаю, что это использование не рекомендуется.Обычно в веб-службах имя и положение элемента определяют его тип.Имеет смысл оставить место в схеме для расширения, используя «любой» .

<sequence>
<element name="a" type="AType"
<element name="b" type="BType"
<any minOccurs="0"

Это позволяет отправлять дополнительную информацию в более позднее время, не делая документ недействительным.

Давайте рассмотрим случай, когда вы расширяете класс AddressType, который определен в схеме

<address xs:type="USAddressType">
   <name
   <line1

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

0 голосов
/ 13 февраля 2011

Атрибут xsi:type обычно не требуется, поскольку схема XSD, содержащаяся в разделе types WSDL, является достаточной информацией для клиента / сервера, чтобы выяснить тип всех элементов.

Но учтите, что иногда необходимо иметь поле или элемент любого типа (xsd:anyType), чтобы вы могли использовать полиморфизм (как вы упомянули сами).

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

Конечно, такой сервис не принимает абсолютно никаких типов, но работает с набором предопределенных типов (т. Е. Вы не отправляете ему просто какую-то ерунду; только допустимые команды из набора типов команд).

Но часть XML - это просто связь. В конечном итоге вам придется что-то делать с этим типом программно, в коде клиент / сервер. Это означает преобразование xsd:anyType в объект на языке программирования.

Инструмент WSDL-To-Code обычно отображает xsd:anyType в верхний класс Object, что, честно говоря, не очень полезно. По этой причине xsd:anyType всегда сериализуется вместе с xsi:type, который указывает фактический тип, так что ваш код знает, какого черта там находится.

Относительно того, насколько оно корректно, отправьте xsi:type в формате doc / literal. Мой ответ: я думаю, что оно действительно. Спецификации WSDL и SOAP не упоминают ничего конкретного, связанного с этим (чтобы запретить это), а спецификация WS-Interoperability это позволяет.

Так что я думаю xsi:type это не что-то положительное или отрицательное, а просто инструмент для работы.

...