xsi:以doc文字格式输入

时间:2010-08-20 08:54:53

标签: xml web-services wsdl

虽然在正常情况下xsi:type没有出现在文字WSDL的SOAP消息中,但仍然存在类型信息是必要的情况,并且它会出现 - 例如,在多态中。如果API期望发送基类型和扩展实例,则必须提供该实例的类型以正确反序列化该对象。

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

示例:

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

而不是

<Device>value</Device>

2 个答案:

答案 0 :(得分: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它不是积极或消极的东西,而只是工作的工具。

答案 1 :(得分:0)

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

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

这允许在不使文档无效的情况下在后一时间发送附加信息。

让我们考虑一种扩展在schema

中定义的类AddressType的情况
<address xs:type="USAddressType">
   <name
   <line1

基本上我(你的合作伙伴)必须为此编写自定义验证,所以我更希望得到一个包含所有已知扩展的XSD,以便我可以使用我的标准验证库。