2010-08-20 68 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,以便可以使用我的標準驗證庫。