TclSOAP

 SOAP(※1)は、 Webサービスの基盤プロトコルです。 Webサービスについては技術誌や関連のWebサイトで詳しい情報が入手できるので省きますが、 ごく簡単にはインターネット上でマルチ言語によるリモートメソッド呼び出しを行う要素技術やその実装の総称です。 TclSOAPはTcl言語によるSOAPの実装で、 Tclから他の言語で書かれた遠隔コンピュータ上のプロシージャ(メソッド) を実行することができます。 TclSOAPは オープンソースで開発・公開されており、 現在のバージョンは1.6.6です。 ActiveStateが配布しているActiveTclにも同梱されています。

(※1) SOAPは元々Simple Object Access Protocolの略ということでしたが、 その名前の枠を越えた用途に広がり始めたのを受けて、 SOAP 1.2から何かの略語ではなく、そういう名前の技術なんだ、 ということになったようです。


インストール

 TclSOAP本体のインストールはとても簡単です。 上記のサイトからアーカイブをダウンロードし、 展開してできたディレクトリ tclsoap1.6.6 をTclのライブラリディレクトリに移動させるだけです。

 が、TclSOAPを使うには、同じくオープンソースで開発・公開されている、 Tcl言語でXMLの構文解析やDOMツリーの操作を行うためのライブラリ、 TclXMLとTclDOM が必要になります。 上記のリンクを辿るか、TclSOAPのページの左「DOM Packages」からリンクを辿って、 TclXML、TclDOMを入手し、インストールする必要があります。
TclXMLやTclDOMは、純粋Tclとしてのインストールの他、 Cコンパイラを使って、C言語で書かれたXMLパーサのライブラリとリンクすることもできます。 しかし、TclSOAPを使うだけであれば、 純粋Tclとしてのインストールで十分で、Cコンパイラによるコンパイルは必要ありません。 純粋Tclとしてのインストール方法は TclXML、TclDOMとも共通で、アーカイブを展開してできたディレクトリにある 「install.tcl」をwishで実行するだけです。 TclSOAPのページでは dom(TclDOMのこと) 1.6以降が必要とありますが、 実験室では、TclXML 2.6とTclDOM 2.5で確認しています。


サンプル

 はてさて、Webサービスを使うためには当然サービスを提供するところのサーバが必要なのですが、 これはどのように作りましょうか、簡単ですが、 こちらのページに載っている、 Java用のWebサービスライブラリ、Apache Axisを使った Webサービスのサンプルを使うことにします。 このサービスの機能は、 月の番号(1〜12)を渡すと「Jan」「Feb」など月の名前の省略形を返す 「getName」というオペレーション(メソッドのことです)と、 その逆の変換をする「getNumber」というオペレーションからなります。 Webサービスを載せるJakarta Tomcatなどのサーブレットコンテナの設定方法については、 このページで扱う範囲を越えてしまうため、全て省略します。

package require dom
package require SOAP

SOAP::create getmonthname \
  -uri "http://falcon.cmxa.nsnhnkmmkk.co.jp:8765/axis/MonthName.jws" \
  -proxy "http://falcon.cmxa.nsnhnkmmkk.co.jp:8765/axis/MonthName.jws" \
  -name getName \
  -action getName \
  -params { "monthNumber" int }

set result [getmonthname 10]
tk_messageBox -message "result:$result"

SOAP::create getmonthnumber \
  -uri "http://falcon.cmxa.nsnhnkmmkk.co.jp:8765/axis/MonthName.jws" \
  -proxy "http://falcon.cmxa.nsnhnkmmkk.co.jp:8765/axis/MonthName.jws" \
  -name getNumber \
  -action getNumber \
  -params { "monthName" string }

set result [getmonthnumber Nov]
tk_messageBox -message "result:$result"
exit
# end.

 Webサービスのオペレーション(リモートメソッド)を定義するには、 SOAP::createコマンドを使います。 -nameはTclコマンドの名前として、オペレーションの名前とは別の名前を指定した場合に、 オペレーションの名前を指定するために必ずつける必要があります。 ここでは getName というオペレーションに getmonthname という名前のTclコマンドをバインドしているので、 「getName」を明示的に指定する必要があります。

 -actionはサービスによって必須(SOAP 1.1では必須)のようです。 上の例はWebサービスのオペレーション名をそのまま指定しています。

 -paramsにはオペレーションに渡す仮引数の名前とデータ型をリストで指定します。 その最初の引数(仮引数の名前)はオペレーション(メソッド)の仮引数の 名前と一致している必要はありません。

拡張レビュー分室 top
(first uploaded 2003/05/18 last updated 2003/05/18, MISUMI URANO)