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

SOAP4Rで遊ぼう_2

NaHiはtutorialを書くのが苦手です。っていうか日本語が駄目。

wiki:SOAP4R?で遊ぼう では

  $ ruby foo.rb
  #<SOAP::RPCUtils::Object:0x466c7a8 @id=153, @name="Paul Duncan (pabs)", @email=#<URI::MailTo:0x502b1f8 URL:mailto:pabs@pablotron.org>>
  #<SOAP::RPCUtils::Object:0x4624e08 @id=587, @name="Paul Duncan (pabs) ", @email=#<URI::MailTo:0x231613c URL:mailto:pabs@pablotron.org>>

なんてことになってます。このSOAP::RPCUtils::Objectってのは、 singleton_methodをいっぱい定義したオブジェクトです。 ↑なら、id、name、emailというメソッドが呼べる。

簡単な用途にはこれでいいですが、singleton_methodなんて定義するとMarshalできないし、 ユーザがメソッドも定義できないので、ユーザが独自に型を定義したいときもある。そのときは、 WSDL4R(SOAP4R)添付のwsdl2rubyというコマンドが使えます(binディレクトリに入ってます。 binaryじゃないけど)。

まず、WSDLファイルを手元にダウンロードします。

  $ ruby -rhttp-access2 -e 'puts HTTPClient.new.getContent("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1/")' > raa.wsdl

次にwsdl2rubyを走らせて、クラス定義ファイル(のひな形)を作ります。

  $ wsdl2ruby.rb --wsdl raa.wsdl --classDef
  I, [Fri Jan 10 11:13:31 GMT+9:00 2003 322080 #356]  INFO -- app: Start of app.
  I, [Fri Jan 10 11:13:31 GMT+9:00 2003 452080 #356]  INFO -- app: Creating class definition.
  I, [Fri Jan 10 11:13:31 GMT+9:00 2003 462080 #356]  INFO -- app: Creates file 'RAA.rb'.
  I, [Fri Jan 10 11:13:31 GMT+9:00 2003 467080 #356]  INFO -- app: End of app. (status: 0)

ログにあるように「RAA.rb」ができているので眺めましょう。

  $ cat RAA.rb
  # http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1
  class Category
    attr_accessor :major	# {http://www.w3.org/2001/XMLSchema}string
    attr_accessor :minor	# {http://www.w3.org/2001/XMLSchema}string
  
    def initialize( major = nil,
        minor = nil )
      @major = major
      @minor = minor
    end
  end
  
  # http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1
  class Product
    attr_accessor :id	# {http://www.w3.org/2001/XMLSchema}int
    attr_accessor :name	# {http://www.w3.org/2001/XMLSchema}string
    attr_accessor :short_description	# {http://www.w3.org/2001/XMLSchema}string
    attr_accessor :version	# {http://www.w3.org/2001/XMLSchema}string
    attr_accessor :status	# {http://www.w3.org/2001/XMLSchema}string
    attr_accessor :homepage	# {http://www.w3.org/2001/XMLSchema}anyURI
    attr_accessor :download	# {http://www.w3.org/2001/XMLSchema}anyURI
    attr_accessor :license	# {http://www.w3.org/2001/XMLSchema}string
    attr_accessor :description	# {http://www.w3.org/2001/XMLSchema}string
  
    def initialize( id = nil,
        name = nil,
        short_description = nil,
        version = nil,
        status = nil,
        homepage = nil,
        download = nil,
        license = nil,
        description = nil )
      @id = id
      @name = name
      @short_description = short_description
      @version = version
      @status = status
      @homepage = homepage
      @download = download
      @license = license
      @description = description
    end
  end
  
  # http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1
  class Owner
    attr_accessor :id	# {http://www.w3.org/2001/XMLSchema}int
    attr_accessor :email	# {http://www.w3.org/2001/XMLSchema}anyURI
    attr_accessor :name	# {http://www.w3.org/2001/XMLSchema}string
  
    def initialize( id = nil,
        email = nil,
        name = nil )
      @id = id
      @email = email
      @name = name
    end
  end
  
  # http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1
  class Info
    attr_accessor :category	# {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1}Category
    attr_accessor :product	# {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1}Product
    attr_accessor :owner	# {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1}Owner
    attr_accessor :update	# {http://www.w3.org/2001/XMLSchema}dateTime
  
    def initialize( category = nil,
        product = nil,
        owner = nil,
        update = nil )
      @category = category
      @product = product
      @owner = owner
      @update = update
    end
  end
  
  # http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1
  class InfoArray < Array; end
  
  # http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.1
  class StringArray < Array; end
  
  # http://xml.apache.org/xml-soap
  class Map
    attr_accessor :item	# 
  
    def initialize( item = nil )
      @item = item
    end
  end

Ownerクラスなどが定義されてます。では、これをrequireしといて wiki:SOAP4R?で遊ぼう のスクリプトをもう一度。。。

  $ ruby -rRAA foo.rb
  #<Owner:0x4656fc8 @email=#<URI::MailTo:0x2348398 URL:mailto:pabs@pablotron.org>, @id=153, @name="Paul Duncan (pabs)">
  #<Owner:0x461e7f0 @email=#<URI::MailTo:0x2311cd8 URL:mailto:pabs@pablotron.org>, @id=587, @name="Paul Duncan (pabs) ">

今度はOwnerクラスのインスタンスが生成されています。これならMarshal.dumpもOKだし、 RAA.rbを書き換えて、独自メソッドを追加することもできます。

なんでrequireしただけで? と思った人は((<SOAP4Rで遊ぼう_3>))へ。

コメント

  • おー、面白いですぅ! でも、wsdl2ruby.rb実行するとwsdl/nameがないってエラーになりますけど... require行をコメントアウトすればばっちり。
  • NaHi: うひーすいません。; なんか手元だと削除してあるみたいです。今晩にでも修正します。 ありがとうございました。