虽然在正常情况下xsi:type没有出现在文字WSDL的SOAP消息中,但仍然存在类型信息是必要的情况,并且它会出现 - 例如,在多态中。如果API期望发送基类型和扩展实例,则必须提供该实例的类型以正确反序列化该对象。
我的问题:以doc / literal格式发送xsi:type的有效性如何?是否有可能找到正式答案(正面/负面)?你有什么想法?
示例:
<Device xsi:type="ns1:DeviceID">value</Device>
而不是
<Device>value</Device>
答案 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,以便我可以使用我的标准验证库。