WSDLを用いたワイヤリング
それでは、実際にWSDLを利用してコンポーネント同士を組み合わせましょう。今回は一切、プログラムコードには手を触れません。すべて、WSDLとコンポジットファイルだけを使用します。実際に試してみたい方は、ページのトップにサンプルコードがありますので、ダウンロードしてお試しください。
WSDLとは
当連載に興味をもたれた方の多くはWSDLについて既に知っていると思います。そのような方は次節の「WSDLとコンポジットファイルの対応関係」までスキップしてください。WSDLを知らない方のためにWSDLについて簡単に説明します。
WSDLとはWeb Services Description Languageの略で、文字どおりWebサービスを記述するための言語です。抽象的な話になるのを避けるために第5回で自動生成したWSDLを参考に説明します。図1がそのWSDLです。今回はWSDL1.1を使用します。WSDL2.0を使用されている方は演習問題だと思って適宜置き換えてください。
WSDLのルート要素はwsdl:definitonsです。その子要素にwsdl.types、wsdl.message、wsdl.portType、wsdl.binding、wsdl.serviceが存在します。これらの要素を使って、Webサービスが使用するプロトコル、プロトコルのメッセージのフォーマット、Webサービス自身の存在場所を明らかにします。今まで当連載を読んでいた方は気づいたと思いますが、WSDLはプロトコルやそのプロトコルで使用するメッセージのフォーマットを指定しており、コンポジットファイルと相通じるものがあります。要は、WSDLを使用するとWebサービスの実装はプロトコルから独立させることができるのです。これは今まで紹介してきたバインディングと同様、コンポーネントから通信プロトコルを独立させることができるということを意味しています。以下にそれぞれの要素の具体的な意味を説明します。
wsdl:types
メッセージのフォーマットを定義します。BasketコンポーネントからCalcChargeコンポーネントを呼び出し、戻り値を返しています。その呼び出し、戻り値のフォーマットを定義するための要素です。W3C XML Schemaの知識がないと正確な意味が理解できないと思いますが、この例は直感的に理解できます。getChargeResponseはint型が0個以上であることを示しています。第5回の例では2個のint型の配列に相当します。最初が送料、2番目が合計金額を格納するためのものです。
getChargeはint型のメッセージであることを定義しています。送料やタイムセールスを適用する前の合計金額を格納するためのメッセージです。
wsdl:message
wsdl:typesでメッセージのフォーマットを定義しており、その名前がメソッド名のようにも見えますが、メッセージに名前を与えています。wsdl:messageにおいてmessageの名前を定義します。wsdl.typesはあくまでもメッセージを構成する要素とその構造を定義します。
wsdl.portType

外部に公開する操作を定義します。ここではgetChargeを外部に公開しています。getChargeを子要素のwsdl:operationで定義します。複数の操作を公開する場合は、そのすべてを定義します。wsdl:operationの子要素として、wsdl:messageで定義したメッセージを指定します。getChargeはあくまでもWSDLで定義する名称であり、CalcChargeのメソッド名とは関係ありません。自動生成したWSDLを使用しているためgetChargeという名称が与えられています。
wsdl:binding
コンポジットのバインディングと同じように操作とプロトコルを分離することを可能にしています。wsdl:portTypeで定義した操作に通信プロトコルを指定せず、wsdl:bindingで指定することで通信プロトコルを分離しています。ここではドキュメントタイプのSOAPを通信プロトコルとして指定しています。
wsdl:service
Webサービスのサービス名称とポート名称を定義します。wsdl:port要素の子要素にSOAP:addressがあり、CalcChargeがありますが、このCalcChargeはTuscanyのコンポーネント名称ではなくwsdl:protTypeで定義したものを指定します。命名の仕方で混乱を与えていますが、WSDLはコンポジットファイルの存在すら知らないため、wsdl:serviceでのaddress指定には、それ以前で定義したものを使用することになります。
WSDLに限らず、定義するものの中に未定義の要素があってはなりません。従って、メッセージフォーマットの定義、メッセージの定義、メッセージを指定した操作の定義、操作の集合であるサービスの定義という順序での定義となります。このような視点で見ると、WSDL自体の構造は至ってシンプルなものであることが分かると思います。ただし、ユーザー型のメッセージフォーマットを定義する場合など、少し複雑なことをしたい時はW3C XML Schemaの知識が必要となります。少し難易度が高いですが、XMLを使う以上避けて通れないため、知らない方は早めに学習することをお薦めします。





