2010-08-20 62 views
1

尽管在正常情况下xsi:type没有出现在文字WSDL的SOAP消息中,但仍然有些情况需要类型信息,例如,它会出现在多态中。如果API需要发送基类型和扩展实例,则必须提供该实例的类型以正确反序列化对象。xsi:以文字文字格式输入

我的问题:以doc/literal格式发送xsi:type的有效性如何?是否可以找到正式答案(正面/负面)?你怎么看?

例如:

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

代替

<Device>value</Device> 

回答

0

xsi:type属性通常不是必要的,因为包含在WSDL的types部XSD模式是足够的信息用于客户机/服务器找出所有元素的类型。

但考虑到有时需要将字段或元素作为任何类型(xsd:anyType),以便您可以使用多态(如您自己提到的那样)。

例如,您可能有一个Web服务,该服务在标记为xsd:anyType的XML字段内运行发送给它的一些命令。这样的服务在设计时没有指定数据类型,所以类型信息必须在运行时提供。

当然,这样的服务并不接受绝对的任何类型,而是使用一组预定义的类型(即,不要只发送任何垃圾;只是来自一组命令类型的有效命令)。

但XML部分只是通信。您最终必须在客户端/服务器代码中使用该类型的程序。这意味着将xsd:anyType转换为编程语言中的对象。

WSDL-To-Code工具通常会将xsd:anyType映射到顶级Object类,坦率地说它并不实用。因此,xsd:anyType总是与xsi:type一起序列化,它指定实际类型,以便您的代码知道其中的内容。

至于如何以doc/literal格式发送xsi:type我的答案是:我认为它是有效的。 WSDL和SOAP规范没有提及与此相关的具体内容(如禁止它),而WS-Interoperability规范允许它。

所以我认为xsi:type它不是正面或负面的东西,但只是工作的工具。

0

我认为这种用法是不鼓励的。通常在Web服务中,元素名称和位置决定了它的类型。在使用"any"进行扩展的模式中保留空间是有意义的。

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

这允许在后一时间发送附加信息而不使文档无效的可能性。

让我们考虑要扩展一个类,地址类型的情况下,即在架构中定义

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

基本上我(你的伴侣)会写这个自定义的验证,所以我宁愿让包含所有已知扩展的XSD,以便可以使用我的标准验证库。