From: Axel Fuchs on 13 Mar 2010 14:37 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='http://www.abundanttech.com/webservices/deadoralive/deadoralive.wsdl' 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! -- Posted via http://www.ruby-forum.com/.
From: Brian Candler on 15 Mar 2010 05:46 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='http://www.abundanttech.com/webservices/deadoralive/deadoralive.wsdl' > 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 http://www.abundanttech.com/webservices/deadoralive/deadoralive.wsdl 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. -- Posted via http://www.ruby-forum.com/.
From: Axel Fuchs on 15 Mar 2010 18:38 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 -- Posted via http://www.ruby-forum.com/.
From: Brian Candler on 16 Mar 2010 05:21 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. -- Posted via http://www.ruby-forum.com/.
From: Axel Fuchs on 16 Mar 2010 11:31 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 -- Posted via http://www.ruby-forum.com/.
|
Pages: 1 Prev: ncurses alternative character set? Next: WSDL Interface to EPO (European Patent Office) |