もっともっとSOAP4Rで遊ぼう
NaHiが書いたと思う?
soap4r/1.4.8が必要です。
サービスを提供するサーバを作ってみましょう。 題材として、http://rnn.sourceforge.jp/ が提供しているような サービス を、実装してみます((-ごらんのように、既にttateさんによって提供されているので、ここでサーバ側実装を してみることに、手順例として以外の意味はありません。-))。
一般に、サーバ側を書くのに2つの手順があるとされています。
1. まずインタフェイスを確定し、そのインタフェイスを記述したファイル(WSDL)を作成。そのWSDLに基づいてサービス提供クラスのスケルトンを作り、そのスケルトンの中身を実装していく。 2. まずサービスを提供するクラスを作り、そのクラスから、インタフェイス記述ファイル(WSDL)を自動生成する。
いずれも最終的に、サービスを提供するクラス(以下サービスクラス)と、 そのインタフェイスを記述したWSDLファイルを用意します。 WSDLファイルはクライアントに提供し、どうやってそのサービスを利用すればいいかを示すために使います。
しかし、実際のところ、WSDLとサービスクラスのどちらかが完全に先で、どちらかが後ということはほとんど ありません。あちらを直し、こちらを合わせして、同期を取りながら開発していくことになります。
とりあえずここでは、(1)の方法を取ります。なぜならSOAP4Rでは(2)をサポートしてないからです。: いつかは(2)もサポートする予定です ((-ちなみにクラスから完全なWSDLを生成するのは、将来もおそらく無理です。そのためには サービスクラスから入力、出力パラメータの型を推測する必要があり、 とてもじゃないけどRubyでは無理・無駄。-))。
というわけでWSDLを書きます→http://rrr.jin.gr.jp/rnn.wsdl いきなりこんなの書けないって?そうでしょうねぇ。。。どうしたもんでしょうか(救い無し)。 「WSDLなんて複雑なものはRubyには不要だ!」と思いました?一理あります。世の中C++やJavaが幅を きかせてるので、こういうものが流行っちゃうんです。なくてもなんとかなることも多いです。 そういう方は、((<RAA:SOAP4R>))のサンプルについている各種サーバ実装を見てみてください。 WSDL無しでも、数行でサーバを作ることができます。
話を戻して。
WSDLは用意できました。次にこのWSDLから、サービスクラスのスケルトンを作りましょう。 wsdl2rubyを起動します。
$ wsdl2ruby.rb --wsdl http://rrr.jin.gr.jp/rnn.wsdl --type server --force I, [2003-01-15T00:31:14.769201 #4412] INFO -- app: Start of app. I, [2003-01-15T00:31:14.878201 #4412] INFO -- app: Creating class definition. I, [2003-01-15T00:31:14.884201 #4412] INFO -- app: Creates file 'RNN.rb'. I, [2003-01-15T00:31:14.894201 #4412] INFO -- app: Creating servant skelton. I, [2003-01-15T00:31:14.900201 #4412] INFO -- app: Creates file 'RNNServant.rb'. I, [2003-01-15T00:31:14.916201 #4412] INFO -- app: Creating standalone stub. I, [2003-01-15T00:31:14.919201 #4412] INFO -- app: Creates file 'RnnService.rb'. !!! IMPORTANT !!! - Standalone stub can only 1 port for now. Creating stub for the first port... Rests are ignored. - Standalone server stub ignores port location defined in WSDL. Location is http://localhost:10080/ by default. Generated client from WSDL must be configured to point this endpoint by hand. !!! IMPORTANT !!! I, [2003-01-15T00:31:14.944201 #4412] INFO -- app: End of app. (status: 0)
ログにあるように、RNN.rb、RNNServant.rb、RnnService?.rbができました。 それぞれサービスクラスが利用する各種クラスの定義、サービスクラスのスケルトン、 サービスクラスをホストするスタンドアローンサーバ ((-そのファイルのみでサービスを提供することができる、つまりHTTPを喋る簡易サーバ。開発中のテスト向け。 そのほか、wsdl2rubyのオプションで、CGIとしてサービスを提供するときのCGIプログラムファイルや、 WEBrick上でサービス提供するときのためのservlet実装ファイルを生成することができます。-)) のサンプルになります。
続きは wiki:もっともっとSOAP4Rで遊ぼう_2 へ。