SOAP-エンコーディング

SOAPには、データ型をエンコードするための一連の組み込みルールが含まれています。これにより、SOAPメッセージは、整数、浮動小数点数、倍精度浮動小数点数、配列などの特定のデータ型を示すことができます。

  • SOAPデータ型は、スカラー型と複合型の2つの大きなカテゴリに分類されます。

  • スカラータイプには、姓、価格、製品の説明など、1つの値のみが含まれます。

  • 複合タイプには、発注書や株価のリストなど、複数の値が含まれます。

  • 複合型はさらに配列と構造体に細分されます。

  • 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スキーマで定義されているすべての組み込み型が採用されています。それでも、SOAPは、配列や参照など、XMLスキーマによって標準化されていない構造を定義するための独自の規則を維持しています。

スカラータイプ

スカラー型の場合、SOAPはXMLスキーマ仕様で指定されたすべての組み込み単純型を採用します。これには、文字列、浮動小数点数、倍精度浮動小数点数、および整数が含まれます。

次の表に、XMLスキーマパート0-入門書から抜粋した主な単純型を示します。 http://www.w3.org/TR/2000/WD-xmlschema-0-20000407/

XMLスキーマに組み込まれた単純な型
シンプルタイプ
ストリング これが電気であることを確認してください。
ブール値 true、false、1、0。
浮く -INF、-1E4、-0、0、12.78E-2、12、INF、NaN。
ダブル -INF、-1E4、-0、0、12.78E-2、12、INF、NaN。
10進数 -1.23、0、123.4、1000.00。
バイナリ 100010
整数 -126789、-1、0、1、126789。
nonPositiveInteger -126789、-1、0。
negativeInteger -126789、-1。
長いです -1、12678967543233
int -1、126789675
ショート -1、12678
バイト -1、126
nonNegativeInteger 0、1、126789
unsignedLong 0、12678967543233
unsignedInt 0、1267896754
unsignedShort 0、12678
unsignedByte 0、126
正の整数 1、126789。
日付 1999-05-31、--- 05。
時間 13:20:00.000、13:20:00.000-05:00

たとえば、これはdoubleデータ型の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個のdouble値の配列を指定します-

arrayType = "xsd:double[10]"

対照的に、次の属性は文字列の2次元配列を指定します-

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

これは、double値の配列を使用した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>

NOTE− SOAPコードを作成するときは、適切なインデントに注意してください。構造体の各要素は、一意のアクセサー名で指定されます。たとえば、上記のメッセージには、名前、価格、説明、SKUの4つのアクセサ要素が含まれています。各要素は独自のデータ型を持つことができます。たとえば、nameは文字列として指定されますが、priceはdoubleとして指定されます。