SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オープンソースApache Tuscanyで楽しむSOA

オープンソースApache Tuscanyで楽しむSOA
第6回「WSDLを使用してWebサービスでワイヤリングしましょう」

既に存在するWebサービスを使用してコンポーネント同士をワイヤリング

ダウンロード サンプルコード (20.0 KB)

WSDLを用いたワイヤリング

 それでは、実際にWSDLを利用してコンポーネント同士を組み合わせましょう。今回は一切、プログラムコードには手を触れません。すべて、WSDLとコンポジットファイルだけを使用します。実際に試してみたい方は、ページのトップにサンプルコードがありますので、ダウンロードしてお試しください。

WSDLとは

 当連載に興味をもたれた方の多くはWSDLについて既に知っていると思います。そのような方は次節の「WSDLとコンポジットファイルの対応関係」までスキップしてください。WSDLを知らない方のためにWSDLについて簡単に説明します。

 WSDLとはWeb Services Description Languageの略で、文字どおりWebサービスを記述するための言語です。抽象的な話になるのを避けるために第5回で自動生成したWSDLを参考に説明します。図1がそのWSDLです。今回はWSDL1.1を使用します。WSDL2.0を使用されている方は演習問題だと思って適宜置き換えてください。

図1.WSDL折りたたみイメージ
図1.WSDL折りたたみイメージ

 WSDLのルート要素はwsdl:definitonsです。その子要素にwsdl.typeswsdl.messagewsdl.portTypewsdl.bindingwsdl.serviceが存在します。これらの要素を使って、Webサービスが使用するプロトコル、プロトコルのメッセージのフォーマット、Webサービス自身の存在場所を明らかにします。今まで当連載を読んでいた方は気づいたと思いますが、WSDLはプロトコルやそのプロトコルで使用するメッセージのフォーマットを指定しており、コンポジットファイルと相通じるものがあります。要は、WSDLを使用するとWebサービスの実装はプロトコルから独立させることができるのです。これは今まで紹介してきたバインディングと同様、コンポーネントから通信プロトコルを独立させることができるということを意味しています。以下にそれぞれの要素の具体的な意味を説明します。

wsdl:types

図2.wsdl:typesの定義
図2.wsdl:typesの定義

 メッセージのフォーマットを定義します。BasketコンポーネントからCalcChargeコンポーネントを呼び出し、戻り値を返しています。その呼び出し、戻り値のフォーマットを定義するための要素です。W3C XML Schemaの知識がないと正確な意味が理解できないと思いますが、この例は直感的に理解できます。getChargeResponseint型が0個以上であることを示しています。第5回の例では2個のint型の配列に相当します。最初が送料、2番目が合計金額を格納するためのものです。

 getChargeint型のメッセージであることを定義しています。送料やタイムセールスを適用する前の合計金額を格納するためのメッセージです。

wsdl:message

図3.wsdl:messageの定義
図3.wsdl:messageの定義

 wsdl:typesでメッセージのフォーマットを定義しており、その名前がメソッド名のようにも見えますが、メッセージに名前を与えています。wsdl:messageにおいてmessageの名前を定義します。wsdl.typesはあくまでもメッセージを構成する要素とその構造を定義します。

wsdl.portType

図4.wsdl:portTypeの定義
図4.wsdl:portTypeの定義

 外部に公開する操作を定義します。ここではgetChargeを外部に公開しています。getChargeを子要素のwsdl:operationで定義します。複数の操作を公開する場合は、そのすべてを定義します。wsdl:operationの子要素として、wsdl:messageで定義したメッセージを指定します。getChargeはあくまでもWSDLで定義する名称であり、CalcChargeのメソッド名とは関係ありません。自動生成したWSDLを使用しているためgetChargeという名称が与えられています。

wsdl:binding

図5.wsdl:bindingの定義
図5.wsdl:bindingの定義

 コンポジットのバインディングと同じように操作とプロトコルを分離することを可能にしています。wsdl:portTypeで定義した操作に通信プロトコルを指定せず、wsdl:bindingで指定することで通信プロトコルを分離しています。ここではドキュメントタイプのSOAPを通信プロトコルとして指定しています。

wsdl:service

図6.wsdl:serviceの定義
図6.wsdl:serviceの定義

 Webサービスのサービス名称とポート名称を定義します。wsdl:port要素の子要素にSOAP:addressがあり、CalcChargeがありますが、このCalcChargeはTuscanyのコンポーネント名称ではなくwsdl:protTypeで定義したものを指定します。命名の仕方で混乱を与えていますが、WSDLはコンポジットファイルの存在すら知らないため、wsdl:serviceでのaddress指定には、それ以前で定義したものを使用することになります。

 WSDLに限らず、定義するものの中に未定義の要素があってはなりません。従って、メッセージフォーマットの定義、メッセージの定義、メッセージを指定した操作の定義、操作の集合であるサービスの定義という順序での定義となります。このような視点で見ると、WSDL自体の構造は至ってシンプルなものであることが分かると思います。ただし、ユーザー型のメッセージフォーマットを定義する場合など、少し複雑なことをしたい時はW3C XML Schemaの知識が必要となります。少し難易度が高いですが、XMLを使う以上避けて通れないため、知らない方は早めに学習することをお薦めします。

次のページ
WSDLとコンポジットファイルの対応関係

修正履歴

この記事は参考になりましたか?

オープンソースApache Tuscanyで楽しむSOA連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4602 2009/12/09 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー