Hi, I am learning how to use WSDL but none of the Ruby Cookbook book
samples work any longer. So I created this example:
#!/usr/bin/ruby
require ‘soap/wsdlDriver’
wsdl=‘Abundant Technologies - IT Consulting Experts’
driver=SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
XSD::Charset.encoding = ‘UTF8’
result = driver.getTodaysBirthdays(nil)
The question is: How do I access the elements of result in this example
and print them out? When I use MAC wsdl client, it look like result is a
XML structure.
Thanks!
Axel Fuchs wrote:
Hi, I am learning how to use WSDL but none of the Ruby Cookbook book
samples work any longer. So I created this example:
#!/usr/bin/ruby
require ‘soap/wsdlDriver’
wsdl=‘Abundant Technologies - IT Consulting Experts’
driver=SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
XSD::Charset.encoding = ‘UTF8’
result = driver.getTodaysBirthdays(nil)
The question is: How do I access the elements of result in this example
and print them out? When I use MAC wsdl client, it look like result is a
XML structure.
I’m afraid I can’t answer your question directly, but the soap4r which
comes bundled with ruby (1.8 at least) is very old. It’s better if you
install the latest soap4r from rubygems:
sudo gem install soap4r
then you get a bunch of useful stuff, including wsdl2ruby.rb. Create an
empty directory, cd into it, then run this:
wget
wsdl2ruby.rb --wsdl deadoralive.wsdl --type client
This creates a bunch of interface code including sample client,
DeadOrAliveClient.rb
Add the following two lines to the top of DeadOrAliveClient.rb (to make
it use the rubygems version of soap4r, not the old bundled one)
require ‘rubygems’
gem ‘soap4r’
Then run it using:
ruby DeadOrAliveClient.rb
ruby -d DeadOrAliveClient.rb # to get wiredumps
Note that the DeadOrAliveHttpGet port/binding isn’t implemented (and the
client barfs when it gets to that point). Just use the DeadOrAliveSoap
interface.
HTH,
Brian.
Brian,
I really appreciate your help. I tried your steps and they all work. I
can see all the data in the wire dump. But how can I get to it using one
of these methods? There must be a way to extract the information.
Thanks,
Axel
Brian,
thank you very much for your help. This is really unnecessarily complex.
The only reason I am interested in SOAP is so that I can access the
patent data information from the European Patent Office (see my other
post).
Thanks again,
Axel
Axel Fuchs wrote:
I
can see all the data in the wire dump. But how can I get to it using one
of these methods? There must be a way to extract the information.
It’s simply the result from the method call, which is an object of class
GetTodaysBirthdaysResponse.
Unfortunately, soap4r can’t break it down further for you, because the
stupid WSDL doesn’t say any more than that it contains a
getTodaysBirthdaysResult which is simply a collection of any XML
elements (note <s:any />)
<s:element name="getTodaysBirthdaysResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name=“getTodaysBirthdaysResult”>
<s:complexType>
<s:sequence>
<s:element ref=“s:schema” />
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
So this is essentially untyped XML. soap4r can’t build you an OO
interface into this; you just have to dig down into the returned XML for
yourself, like this.
$ irb --simple-prompt
require ‘rubygems’
=> true
gem ‘soap4r’
=> true
require ‘defaultDriver’
=> true
obj = DeadOrAliveSoap.new
=>
#<DeadOrAliveSoap:#SOAP::RPC::Proxy:http://www.abundanttech.com/WebServices/DeadOrAlive/DeadOrAlive.asmx>
obj.wiredump_dev = STDERR
=> #IO:0xb7c56f54
result = obj.getTodaysBirthdays(nil)
Wire dump:
…
=> #<GetTodaysBirthdaysResponse:0xb7620900 @getTodaysBirthdaysResult=…
result.methods - methods
=> [“getTodaysBirthdaysResult”, “getTodaysBirthdaysResult=”]
br = result.getTodaysBirthdaysResult
=> #<GetTodaysBirthdaysResponse::GetTodaysBirthdaysResult:0xb76207fc
@schema=…
@diffgram=…
br.methods - methods
=> [“diffgram”, “diffgram=”, “__xmlele_any”, “set_any”, “schema”,
“schema=”]
br.diffgram
=> #<SOAP::Mapping::Object:0x…fdbb0aecc
{}NewDataSet=#<SOAP::Mapping::Object:0x…fdbb0abac
{}Table=[#<SOAP::Mapping::Object:0x…fdbb0ab34 {}FullName=“Cunningham,
Walter”…
br.diffgram[‘NewDataSet’]
=> #<SOAP::Mapping::Object:0x…fdbb0abac {}Table=[…
br.diffgram[‘NewDataSet’][‘Table’][0]
=> #<SOAP::Mapping::Object:0x…fdbb0ab34 {}FullName=“Cunningham, Walter”
{}BirthDate=“03/16/1932” {}DeathDate="" {}Age=“78”
{}KnownFor=“Astronauts - Other” {}DeadOrAlive=“Alive”>
br.diffgram[‘NewDataSet’][‘Table’][0][‘FullName’]
=> “Cunningham, Walter”
So despite all the complexity of SOAP and WSDL, it doesn’t help you at
all. Why don’t you suggest that they change to JSON instead 
HTH,
Brian.
On Wed, Mar 17, 2010 at 12:31:57AM +0900, Axel Fuchs wrote:
Brian, thank you very much for your help. This is really
unnecessarily complex. The only reason I am interested in SOAP
is so that I can access the patent data information from the
European Patent Office (see my other post).
I’ve posted some code on their forum:
http://forums.epo.org/open-patent-services-and-publication-server-web-service/topic898.html
The attached copies are slightly more updated.
The code doesn’t use anything but handmade XML processing
since soap4r couldn’t cope with WSDL2 or whatever new and
improved spec version EPO has migrated to (espacenet was
fine), and time was pretty short to wrestle with wso2.org
first. I did run it last December, still worked back then.