Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

もっともっと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に接続しに行くのでした。 というわけで、このクライアントは、スタンドアロンサーバと同じホストで動かしてください。;

(続く)