2010-08-20 6 views
1

Bien que dans des circonstances normales, xsi: type n'apparaisse pas dans le message SOAP d'un littéral WSDL, il existe toujours des cas où des informations de type sont nécessaires et apparaîtront - dans le polymorphisme, par exemple. Si l'API attend un type de base et qu'une instance d'extension est envoyée, le type de cette instance doit être fourni pour désérialiser correctement l'objet.xsi: taper au format littéral doc

Ma question: Quelle est la validité de l'envoi de xsi: type au format doc/littéral? Est-il possible de trouver une réponse officielle (positive/négative)? Quelles sont vos pensées?

exemple:

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

au lieu de

<Device>value</Device> 

Répondre

0

L'attribut xsi:type est normalement pas nécessaire puisque le schéma XSD contenu dans la section types du WSDL est assez d'information pour le client/serveur pour comprendre le type de tous les éléments. Mais considérons qu'il est parfois nécessaire d'avoir un champ ou un élément comme étant de n'importe quel type (xsd:anyType) afin que vous puissiez utiliser le polymorphisme (comme vous l'avez mentionné vous-même). Par exemple, vous pouvez avoir un service Web qui exécute certaines commandes envoyées dans un champ XML marqué xsd:anyType. Un tel service ne spécifie rien sur le type de données au moment de la conception. Par conséquent, les informations de type doivent être fournies lors de l'exécution. Bien entendu, un tel service n'accepte absolument aucun type, mais fonctionne avec un ensemble de types prédéfinis (c'est-à-dire que vous ne lui envoyez pas de merde, seulement des commandes valides à partir d'un ensemble de types de commandes).

Mais la partie XML est juste une communication. Vous devez éventuellement faire quelque chose avec ce type de programme, dans le code client/serveur. Cela signifie que vous devez convertir le xsd:anyType en objet dans un langage de programmation.

Un outil WSDL-To-Code mappe généralement un xsd:anyType à la classe supérieure Object, ce qui n'est franchement pas très utile. Pour cette raison, un xsd:anyType est toujours sérialisé avec un xsi:type qui spécifie le type réel afin que votre code sache ce que le diable est là.

En ce qui concerne la validité, envoyez xsi:type en doc/littéral. Ma réponse est: Je pense que c'est valide. Les spécifications WSDL et SOAP ne mentionnent rien de spécifique lié à cela (pour l'interdire), et la spécification WS-Interoperability le permet.

Donc, je pense que ce n'est pas quelque chose de positif ou négatif, mais juste un outil pour le travail.

0

Je pense que cette utilisation est déconseillée. Généralement dans les services Web, le nom et la position de l'élément dictent son type. Il est logique de laisser de la place dans un schéma d'expansion en utilisant "any".

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

Ceci permet d'envoyer des informations supplémentaires à un moment ultérieur sans invalider le document.

Considérons un cas où vous étendez une classe, AddressType, qui est défini dans le schéma

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

Fondamentalement, je (votre partenaire) devra rédiger une validation personnalisée pour cela, donc je préférerais obtenir un XSD qui contient toutes les extensions connues pour que je puisse utiliser mes bibliothèques de validation standard.

Questions connexes