JAVA Developer 2003年12月号より転載
WSDLは、Webサービスの提供者が用意するもので、正式な仕様はW3C(http://www.w3.org/TR/2001/NOTE-wsdl-20010315)で公開されています。WSDLの構造を見ていきましょう。
●WSDLの物理構造
WSDLは、図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 WSDLに記述されている定義の相対関係
関連リンク
JAVA Developer
定期購読のご案内
バックナンバー販売協力店
|
JAVA Developer 12月号
大特集
UML2.0のすべて
特集2 AS徹底解説
Cosminexus
[特別企画]
・UMLダイヤグラムベースで次世代プログラミング
・OptimalJによるMDA開発の実際
・WSDLの秘密を探る!
・AxisによるWebサービス活用記
|
|