エンタープライズ:特集 2003/11/24 19:40:00 更新

[JAVA Developer特別企画]2003年12月号
AxisによるAmazon Webサービス活用記 (2/4)

JAVA Developer 2003年12月号より転載

2.WSDLのフォーマット
 WSDLは、Webサービスの提供者が用意するもので、正式な仕様はW3C(http://www.w3.org/TR/2001/NOTE-wsdl-20010315)で公開されています。WSDLの構造を見ていきましょう。

●WSDLの物理構造
 WSDLは、図2-1のような構造です。

図2-1
図2-1 WSDLの構造

 WSDLは、wsdl:definitions要素の属性でWebサービスの基本的な定義を記述し、その内容に詳細を記述します。詳細は、大きく5つのパートで構成されます。
(1)抽象データ型定義
 入出力メッセージ(送受信されるデータ)で使われるデータ型を定義します。
(2)メッセージ定義
 Webサービスオペレーションで使用されるメッセージを定義します。
(3)メッセージ組み合わせ定義
 Webサービスオペレーション(Webサービスの操作)の名前と、入出力メッセージ名を定義します。
(4)プロトコルバインディング定義
 Webサービスオペレーションが、どのような送受信プロトコルでメッセージをやりとりするかを定義します。
(5)Webサービス定義
 Webサービス名とWebサービスを提供している(デフォルトの)エンドポイント(所在地)を定義します。
 実際にAmazon WebサービスのWSDL(AmazonWebServices.wsdl)を例に、それぞれの定義内容を見ていきます。なお便宜上、WSDLファイル内での並び順では下から上への説明となります。

●Webサービス定義(リスト2-1)
 service要素でWebサービス定義します。これがWebサービスの入り口となる定義です。
 service要素では、name属性を使ってWebサービスの名称を定義します。その子要素としてport要素があり、name属性でポート名、binding属性で使用するプロトコルバインディング名を定義します。さらにport要素の子要素として、soap:address要素が記述され、location属性でWebサービスのエンドポイントを定義しています。
 プロトコルによって接頭辞は変わりますが、Webサービスのエンドポイント(URL)は、WSDLの最後を見ればわかるということですね。

リスト2-1 Webサービス定義(AmazonWebServices.wsdl)

<service name="AmazonSearchService">
 <!-- Endpoint for Amazon Web APIs -->
 <port name="AmazonSearchPort"
       binding="typens:AmazonSearchBinding">
   <soap:address location="http://soap.amazon.com/onca/soap3"/>
 </port>
</service>

●プロトコルバインディング定義(リスト2-2)
 binding要素でプロトコルバインディングを定義します。binding要素の内容としては、name属性に上記port要素のbinding属性の内容(接頭辞なし)が、type属性には同じくport要素のname属性の内容(接頭辞付き)が記述されています。

リスト2-2 プロトコルバインディング定義(AmazonWebServices.wsdl)

<binding name="AmazonSearchBinding"
        type="typens:AmazonSearchPort">
 <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
 <!-- Binding for Amazon Web APIs - RPC, SOAP over HTTP -->
 <operation name="KeywordSearchRequest">
   <soap:operation soapAction="http://soap.amazon.com"/>
   <input>
     <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/en
coding/" namespace="http://soap.amazon.com"/>
   </input>
   <output>
     <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/en
coding/" namespace="http://soap.amazon.com"/>
   </output>
 </operation>
 <operation name="TextStreamSearchRequest">
   <soap:operation soapAction="http://soap.amazon.com"/>
   <input>
     <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/en
coding/" namespace="http://soap.amazon.com"/>
   </input>
   <output>
     <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/en
coding/" namespace="http://soap.amazon.com"/>
   </output>
 </operation>

   以下、省略 

 binding要素の子要素には、プロトコルを定義するsoap:binding要素とWebサービスオペレーションのoperation要素が記述されています。内容は表2-1のとおり、soap:binding要素は、styleとtransport属性を持ちます。

表2-1 主なSOAPバインディング拡張要素の属性

要素名 属性名 内容
soap:binding style オペレーションがrpcまたはdocumentのいずれかの値を指定
transport SOAPメッセージが転送されるネットワークトランスポートプロトコル(HTTP、SMTPなど)を指定
soap:operation style soap:binding要素で定義したstyle属性を上書き。オペレーションがrpcまたはdocumentのいずれかの値を指定(オプション)
soapAction オペレーションのハンドラを識別
soap:body use メッセージ部分をエンコードするかを指定。encodedが指定された場合、message要素のtype属性で設定された抽象データ型を参照
encodingStyle メッセージのさまざまな部分で実行されるエンコードの種類を指定
namespace RPCスタイルのオペレーションの場合、パラメータをラップするラップ要素の名前空間

 operation要素は、Webサービスオペレーションの名前を定義したname属性を持ちます。子要素はsoap:operation要素、input要素、output要素の3要素で、input要素とoutput要素はそれぞれ子要素としてsoap:body要素が持ちます。
 プロトコルバインディング定義は、Webサービスが使用するプロトコルによってbinding要素の子要素が変わります。

●メッセージ組み合わせ定義(リスト2-3)
 portType要素でWebサービスオペレーションが使用する入出力メッセージの組み合わせを定義します。
 portType要素のname属性にservice要素の子要素であるport要素で定義した名前が記述します。portType要素は、子要素としてoperation要素を複数持ちます。
 operation要素は、name属性でWebサービスオペレーション名を定義し、子要素としてinput要素とoutput要素を持ちます。input要素とoutput要素は、それぞれ入力メッセージと出力メッセージを定義するもので、message属性でメッセージ名を定義します。

リスト2-3 メッセージ組み合わせ定義(AmazonWebServices.wsdl)

<portType name="AmazonSearchPort">
 <!-- Port for Amazon Web APIs -->
 <operation name="KeywordSearchRequest">
   <input message="typens:KeywordSearchRequest"/>
   <output message="typens:KeywordSearchResponse"/>
 </operation>
 <operation name="TextStreamSearchRequest">
   <input message="typens:TextStreamSearchRequest"/>
   <output message="typens:TextStreamSearchResponse"/>
 </operation>
 <operation name="PowerSearchRequest">
   <input message="typens:PowerSearchRequest"/>
   <output message="typens:PowerSearchResponse"/>
 </operation>

   以下、省略

●メッセージ定義(リスト2-4)
 オペレーションで使用されるメッセージ定義として、message要素を列挙します。message要素は、name属性でメッセージ名を定義し、子要素のpart要素で抽象データを定義します。part要素では、name属性でデータ名をtype属性で抽象データ型を定義します。

リスト2-4 メッセージ定義(AmazonWebServices.wsdl)

<message name="KeywordSearchRequest">
 <!-- Messages for Amazon Web APIs -->
 <part name="KeywordSearchRequest"
       type="typens:KeywordRequest"/>
</message>
<message name="KeywordSearchResponse">
 <part name="return"
       type="typens:ProductInfo"/>
</message>
<message name="TextStreamSearchRequest">
 <part name="TextStreamSearchRequest"
       type="typens:TextStreamRequest"/>
</message>

   以下、省略

●抽象データ型定義(リスト2-5)
 wsdl:types要素で、Webサービスで使用する抽象データ型を定義します。WSDLでは最初にこの抽象データ型定義を記述します。
 wsdl:types要素の子要素は、xsd:schema要素です。このxsd:schema要素は、仕様として複数定義することが可能です。xsd接頭辞が使用されていることから容易に想像できると思いますが、抽象データ型の定義はXMLスキーマが利用されます。従って、抽象データ型定義を理解するには、XMLスキーマについての理解が必要になります。

リスト2-5 抽象データ型定義(AmazonWebServices.wsdl)

<wsdl:types>
 <xsd:schema xmlns=""
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             targetNamespace="http://soap.amazon.com">
   <xsd:complexType name="ProductLineArray">
     <xsd:complexContent>
       <xsd:restriction base="soapenc:Array">
         <xsd:attribute ref="soapenc:arrayType"
                        wsdl:arrayType="typens:ProductLine[]"/>
       </xsd:restriction>
     </xsd:complexContent>
   </xsd:complexType>
   <xsd:complexType name="ProductLine">
     <xsd:all>
       <xsd:element name="Mode"
                    type="xsd:string"
                    minOccurs="0"/>
       <xsd:element name="ProductInfo"
                    type="typens:ProductInfo"
                    minOccurs="0"/>
     </xsd:all>
   </xsd:complexType>

   以下、省略

●WSDLの全体像を把握する
 図2-2は、Amazon WebサービスのWSDLに定義されている内容を基に、各定義の相関を示したものです。Webサービス定義からプロトコルバインディング定義とメッセージ組み合わせ定義へ。さらにメッセージ定義、抽象データ定義へと関係は続きます。

図2-2
図2-2 WSDLに記述されている定義の相対関係

関連リンク
▼JAVA Developer
▼定期購読のご案内
▼バックナンバー販売協力店


JAVA Developer12月号表紙
JAVA Developer 12月号

大特集
UML2.0のすべて

特集2 AS徹底解説
 Cosminexus

[特別企画]
・UMLダイヤグラムベースで次世代プログラミング
・OptimalJによるMDA開発の実際
・WSDLの秘密を探る!
・AxisによるWebサービス活用記

前のページ | 1 2 3 4 | 次のページ

[松浦 武範,JAVA Developer]

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.