SOAP - 編碼



SOAP 包含一組內建規則,用於編碼資料型別。它使 SOAP 訊息能夠指示特定的資料型別,例如整數、浮點數、雙精度數或陣列。

  • SOAP 資料型別分為兩大類:標量型別和複合型別。

  • 標量型別只包含一個值,例如姓氏、價格或產品描述。

  • 複合型別包含多個值,例如採購訂單或股票報價列表。

  • 複合型別進一步細分為陣列和結構體。

  • SOAP 訊息的編碼樣式透過SOAP-ENV:encodingStyle 屬性設定。

  • 要使用 SOAP 1.1 編碼,請使用值 http://schemas.xmlsoap.org/soap/encoding/

  • 要使用 SOAP 1.2 編碼,請使用值 http://www.w3.org/2001/12/soap-encoding

  • 最新的 SOAP 規範採用 XML Schema 定義的所有內建型別。但是,SOAP 保持其自身約定來定義 XML Schema 未標準化的結構,例如陣列和引用。

標量型別

對於標量型別,SOAP 採用 XML Schema 規範指定的所有內建簡單型別。這包括字串、浮點數、雙精度數和整數。

下表列出了主要簡單型別,摘自 XML Schema 第 0 部分 - Primer http://www.w3.org/TR/2000/WD-xmlschema-0-20000407/

XML Schema 內建的簡單型別
簡單型別 示例
string 確認這是電動的。
boolean true, false, 1, 0。
float -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN。
double -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN。
decimal -1.23, 0, 123.4, 1000.00.
binary 100010
integer -126789, -1, 0, 1, 126789.
nonPositiveInteger -126789, -1, 0.
negativeInteger -126789, -1.
long -1, 12678967543233
int -1, 126789675
short -1, 12678
byte -1, 126
nonNegativeInteger 0, 1, 126789
unsignedLong 0, 12678967543233
unsignedInt 0, 1267896754
unsignedShort 0, 12678
unsignedByte 0, 126
positiveInteger 1, 126789.
date 1999-05-31, ---05.
time 13:20:00.000, 13:20:00.000-05:00

例如,這是一個帶有雙精度資料型別的 SOAP 響應:

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
   
   <SOAP-ENV:Body>
      <ns1:getPriceResponse 
         xmlns:ns1 = "urn:examples:priceservice"  
         SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">
         <return xsi:type = "xsd:double">54.99</return>
      </ns1:getPriceResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

複合型別

SOAP 陣列有一套非常具體的規則,要求您同時指定元素型別和陣列大小。SOAP 也支援多維陣列,但並非所有 SOAP 實現都支援多維功能。

要建立陣列,必須將其指定為陣列的xsi:type。陣列還必須包含arrayType 屬性。此屬性是必需的,用於指定所包含元素的資料型別和陣列的維度。

例如,以下屬性指定了一個包含 10 個雙精度值的陣列:

arrayType = "xsd:double[10]"

相反,以下屬性指定了一個二維字串陣列:

arrayType = "xsd:string[5,5]"

這是一個包含雙精度值陣列的 SOAP 響應示例:

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">

   <SOAP-ENV:Body>
      <ns1:getPriceListResponse 
         xmlns:ns1 = "urn:examples:pricelistservice"  
         SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">

         <return xmlns:ns2 = "http://www.w3.org/2001/09/soap-encoding"  
            xsi:type = "ns2:Array" ns2:arrayType = "xsd:double[2]">
            <item xsi:type = "xsd:double">54.99</item>
            <item xsi:type = "xsd:double">19.99</item>
         </return>
      </ns1:getPriceListResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

結構體包含多個值,但每個元素都使用唯一的訪問器元素指定。例如,考慮產品目錄中的一個專案。在這種情況下,結構體可能包含產品 SKU、產品名稱、描述和價格。以下是此類結構體在 SOAP 訊息中的表示方式:

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">

   <SOAP-ENV:Body>
      <ns1:getProductResponse
         xmlns:ns1 = "urn:examples:productservice" 
         SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">
		
         <return xmlns:ns2 = "urn:examples" xsi:type = "ns2:product">
            <name xsi:type = "xsd:string">Red Hat Linux</name>
            <price xsi:type = "xsd:double">54.99</price>
            <description xsi:type = "xsd:string">
               Red Hat Linux Operating System
            </description>
            <SKU xsi:type = "xsd:string">A358185</SKU>
         </return>
      </ns1:getProductResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

注意 - 請在編寫 SOAP 程式碼時注意正確的縮排。結構體中的每個元素都使用唯一的訪問器名稱指定。例如,上述訊息包含四個訪問器元素:名稱、價格、描述和 SKU。每個元素可以具有自己的資料型別。例如,名稱指定為字串,而價格指定為雙精度數。

廣告