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: うひーすいません。; なんか手元だと削除してあるみたいです。今晩にでも修正します。 ありがとうございました。