WSDLで定義できること、できないこと
■WSDLで定義できること
WSDLはXML文書として記述されるため、もちろんそのスキーマが存在する。おおまかには、以下のような構造を持つ。
それぞれの要素について、解説していこう。
■types
types要素では、下位データタイプを定義する。すなわち、「このWSDLの中で出てくる、この名前のデータの型はこういうものだよ」というのを定義する、ということである。ネストした型も定義できる。types要素には具体的にはスキーマ定義が入れられる。インターオペラビリティを最大限確保するために、XSD(XML Schema DataType)を使うことが望ましい、と仕様の中では説明されている。例えば、useridとpasswordをストリングで含んだUseridというデータタイプ(Javaでいえばクラス)があれば、そういったことが定義されると思えばよい。ユーザーの名前、住所、電話番号などを持つUserdata型、といったものも定義できる。
■message
message要素では、送信データフォーマットを定義する。例えば、要求として受信するメッセージは、どのような名前(の要素)で、それには、どの(typesで定義された)データタイプが含まれるのか、ということを定義する。送受信されるメッセージの最終的な全体像を定義するものである。例えば、要求としてUserid型とUserinfoを渡すとすれば、それがインプットの型として定義される。
■portType
portType要素では、message要素で定義された送信データフォーマットをいくつか組み合わせて、1つの操作単位を論理的に定義する。この送信メッセージを受け取ったら、この送信メッセージで返事が返るよ、ということをいっているのである。WSDLで定義できるportTypeには、大きく分けて以下の4種類がある。
- One-way(一方向):エンドポイントがメッセージを受け取るだけ
- Request-response(要求-応答):エンドポイントに対しての要求に対して、応答を返す
- Solicit-response(送信請求-応答):エンドポイントがメッセージを送信し、関連するメッセージを受け取る
- Notification(通知):エンドポイントがメッセージを送信する
■binding
binding要素では、上のtypes、message、portTypeなどで定義されたインターフェイスの論理的なモデル(こういうデータ型を組み合わせて、こういうメッセージで、こういうやりとりをするという定義)と、物理的なモデル(例えば、SOAP-RPCを、HTTP上で行うという定義)とを結び付ける定義をする。これによって、具体的にどのような機能のクライアントを準備すれば、このサービスインターフェイスにアクセスできるかが明確になるといえる。現在のWSDLでは、バインディングの定義の対象として、SOAP-RPC、SOAP-Document、HTTP、MIMEなどを指定することができる。SOAPの部分に関してはSOAP拡張と呼んでいる。
■service
バインディングまでの定義によって、接続するためのプログラムの仕様(インターフェイス定義)までが済んだといえる。さらに、このインターフェイスを提供する、具体的なアクセスポイントを定義するのがservice要素である。このservice要素によって名前を付け、アクセスポイントをport要素で定義する。
■port
port要素では、どのbinding要素のインターフェイスを、どのURLで提供するかを定義する。これによって、WSDLでも提供するアクセスポイントを定義することができる。
■WSDLで定義できないこと
インターフェイスを定義する、といっているが、APIのマニュアルのように考えると思い違いなので注意しよう。WSDLでは、データ型、入力、出力、トランスポート、アドレス、といったことは定義できるが、「どういう目的で、どういう意味を持って、どういう処理が行われるか」ということは定義できない。
例えば、ストリング型の「name」を渡すとDate型の日付データが戻る「getDate」メソッドが存在するとする。これだけではそのメソッドの意味は読み取ることはできないだろう。その名前の人間の生年月日を返すのかもしれないし、その名前の国の建国記念日かもしれない。このような「意味」を示す情報のことをセマンティクスということがある。今日のセマンティクスの定義は自然言語(人間の言葉)で記述されているのが現状であり、セマンティクス定義のための方法論や言語の出現が望まれている。
■WSDLはどう使われるか
もうお気付きの読者もいると思うが、WSDLの構造は、説明の説明の説明……というふうに構造化されており、いわゆるメタデータの構造をとっている。
1つの定義は、より上位の定義で複数回使われても構わない。同じ内容のものが別の名前で存在しても構わないが、1つにまとめることもできる。1つのデータタイプを複数のメッセージで使うことはもちろん、同じメッセージを入力や出力に使うportTypeが複数あったとしても構わない。
よくある(考えられる)例として、同じサービスを提供するサイトを負荷分散や地域ごとのサービスのために、複数のサーバで提供するということがあるだろう。この場合、例えば、インターフェイス定義のみ(types、message、portType、binding)を1つのWSDLファイルで提供し、負荷分散したサーバごとに、アドレス(service、port)を提供するためのWSDLを準備するということが考えられる。その場合、後者のWSDLには、インターフェイス定義を<import>要素で取り込むことができる。
Copyright © ITmedia, Inc. All Rights Reserved.