もっともっとSOAP4Rで遊ぼう_2
サービスを提供するサーバを作ってみましょう、の続きです。 wiki:もっともっとSOAP4Rで遊ぼう では、 http://rnn.sourceforge.jp/ が提供しているような サービス を実装することを目的に ((-繰り返しますが、ここでサーバ側実装をしてみることに、手順例として以外の意味はありません。-))、 まずはWSDLから各種スケルトンを生成しました。
- RNN.rb: サービスクラスが利用する各種クラスの定義
- RNNServant.rb: サービスクラスのスケルトン
- RnnService?.rb: サービスクラスをホストするスタンドアローンサーバ
RNN.rbは、WSDLで定義した、このサービスで利用する各種クラスを実装したものです。 デフォルトでは、インスタンス変数へのアクセサメソッド、および初期化メソッドが実装されています。
RNNServant.rbは、サービスの実装そのものです。例えば今回なら、「RNNの最新n個の記事を提供する」 などのメソッドを実装していく必要があります。デフォルトでは全て、NotImplementedError?例外を返すように なっています。
RnnService?.rbは、RNNServant.rbで実装しているサービスクラスを インスタンス化し、クライアントからのSOAP over HTTPでの接続を受けて適宜サービスクラスを呼び出し、 戻り値を再びSOAP over HTTPで返すための実装が含まれています。 基本的に、このファイルの中に手を入れる必要はありません。
字が多くなってきたので説明はやめて、とりあえず走らせましょう。 サービスを提供するスタンドアローンサーバ、RnnService?.rbの中身を確認して起動します。
$ tail -2 RnnService.rb # Change listen port. App.new( 'app', nil, '0.0.0.0', 10080 ).start $ ruby RnnService.rb
RnnService?.rbの末尾にある「0.0.0.0:10080」が、このスタンドアローンサーバの サービス提供URLです。 応答がなくなり、プロンプトに返ってきませんが、サーバは動いています。 止めるにはCtrl-Cを叩いてください。
ではクライアント側。((<RNNとSOAP4Rで遊ぼう>))を流用します。
$ cat client.rb require 'soap/wsdlDriver' wsdl = 'http://rrr.jin.gr.jp/rnn.wsdl' rnn = SOAP::WSDLDriverFactory.new(wsdl).createDriver rnn.generate_explicit_type = true p rnn.topics
wiki:RNNとSOAP4R?で遊ぼう のサンプルとの違いは、WSDLだけです。 では起動。
$ ruby client.rb ./RNNServant.rb:100:in `topics': NotImplementedError (NotImplementedError)
無事NotImplementedError?が戻ってきました。まだ何も書いてないんだから当たり前です。 RNNServant.rbにデフォルトで記述されているとおり、例外が上がります。
本当にさきほどのスタンドアローンサーバが起動されたかどうか不安ですか? サーバを「ruby -d RnnService?.rb」などとデバッグオプション付きで起動すると、 アクセスがあったときにいろいろメッセージを出力するので試してみてください。
ところで、何故このクライアントは、WSDLしか指定していないのに、ちゃんと先ほど立ち上げた スタンドアロンサーバに接続しに行くのでしょうか。もちろん答えはWSDLの中にあります。 WSDLの最後のほうを見ると、<soap:address location="http://localhost:10080"/> という記述があります。つまり、このWSDLを使うと、クライアントは、 「そのクライアントが動いているホスト」の10080に接続しに行くのでした。 というわけで、このクライアントは、スタンドアロンサーバと同じホストで動かしてください。;
(続く)