RubyでSOAP-RPCサーバを作る2

WSDLができたら、後は楽ちんでした。soap4rに付属のwsdl2rubyをつかってrubyスクリプトを生成して実際のメソッドを実装すればそれでオシマイ。

ruby wsdl2ruby --wsdl  ./lovmac.wsdl --type server --force

で、3つのrubyスクリプトが生成されます。

  1. LovemacServer.rb
  2. LovemacService.rb
  3. LovemacServiceServant.rb

1.はSOAPサーバの本体。基本的にこれを修正することはなさそうです。2.はWSDLで定義したメッセージに関するクラスが生成されていました。作成したWSDLで言えば、types要素の部分がrubyのクラスとして生成されていました。ItemInfoResultはvalueオブジェクトとして、ItemInfoResultArrayは::Arrayの派生クラスとしてそれぞれ定義されています。

require 'xsd/qname'

# {urn:LovemacServices}ItemInfoResult
class ItemInfoResult
  @@schema_type = "ItemInfoResult"
  @@schema_ns = "urn:LovemacServices"
  @@schema_element = [["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]],
   ["age", ["SOAP::SOAPUnsignedInt", XSD::QName.new(nil, "age")]]]

  attr_accessor :name
  attr_accessor :age

  def initialize(name = nil, age = nil)
    @name = name
    @age = age
  end
end

# {urn:LovemacServices}ItemInfoResultArray
class ItemInfoResultArray < ::Array
  @@schema_type = "ItemInfoResult"
  @@schema_ns = "urn:LovemacServices"
  @@schema_element = [["item", ["ItemInfoResult", XSD::QName.new(nil, "item")]]]
end

最後、3.に実際の処理を実装して完了です。処理の実装は、wsdlのoperationで定義したメソッドのスケルトンが生成されていますのでここに2.で定義したクラスを使用して普通にRubyスクリプトを書きます。今回の場合、情報取得の部分はこんな感じ。(serviceStart()とserviceEnd()はそれぞれデータベースへの接続・切断処理を入れています)これでサーバ側の処理は完了。

  def getItemInfo(find_age)
    p [find_age]
    result = ItemInfoResultArray.new
    @mysql.query("select name,age from sample_t where age >= #{find_age}").each do | c |
      result << ItemInfoResult.new(c[0],c[1])
    end
    result
  end

後はクライアントのスクリプトを用意してテストします。

require 'soap/wsdlDriver'

  lovm = SOAP::WSDLDriverFactory.new('./lovemac.wsdl').create_rpc_driver
  lovm.generate_explicit_type = true
  if lovm.serviceStart
    result =  lovm.getItemInfo(18)
    result.each do | r |
      puts "#{r.name} [年齢]#{r.age}"
    end
    lovm.serviceEnd
  else
    puts "connect error!"
  end

wsdlさえ書けてしまえば後は比較的簡単にできました。これでようやく、SOAP-RPCサーバが完成。そもそもの目的だったマック用GUIアプリの作成に取りかかれます。ところで、ApplescriptってSOAPだけじゃなくてXMLRPCにも対応していることに今更気が付きました。なにも、時間をかけてSOAP化することなかったなぁー。まあ、勉強できてヨカッタけど。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/145
【くう特捜部】ログ から 金, 2007/04/20 - 08:51 受信

当ブログのユニーク・アクセス数は、付属のユニーク・アクセスカウンター(U)の2.5〜3倍と見ていただくとちょうど良いみたいです。
ライブドア・本当にやっつける。一部のジャバ表...

Comments