In previous blog posts I showed how I created a Java web service and client using Apache Axis2. In those examples I showed how to read from web service methods that return a single object, and also an array or list of objects. In this post I'll show several sample Ruby programs that also read from those same Java web services.
Here's the first Ruby client I created. I first hit the WSDL URL for the web service, then call the
getUser method of the web service. Then I use the
inspect to show the information that is returned by the call.
require 'soap/wsdlDriver' WSDL_URL = "http://localhost:8080/axis2/services/UserService?wsdl" factory = SOAP::WSDLDriverFactory.new(WSDL_URL) driver = factory.create_rpc_driver puts "USER: " puts driver.getUser().inspect
My second approach
After creating that first web service I got a little more curious on how I would convert this
User object into a Ruby
User object, so I created this sample program:
require 'soap/rpc/driver' require 'cgi' class User attr :first_name, :last_name, :user_id end endpoint = 'http://localhost:8080/axis2/services/UserService' namespace = 'http://service.pojo.sample' soap = SOAP::RPC::Driver.new(endpoint, namespace) soap.add_method('getUser') remoteUser = soap.getUser p remoteUser.firstName p remoteUser.lastName p remoteUser.userId u = User.new u.first_name = remoteUser.firstName u.last_name = remoteUser.lastName u.user_id = remoteUser.userId
Reading an array of objects
Finally, I created some sample Ruby code to show how I would read an array of objects from a web service. The Ruby source code for this solution is shown here:
require 'soap/rpc/driver' require 'cgi' endpoint = 'http://localhost:8080/axis2/services/UserService' namespace = 'http://service.pojo.sample' soap = SOAP::RPC::Driver.new(endpoint, namespace) soap.add_method('getUserArray') result = soap.getUserArray first = result printf "%s %s %s\n", first.firstName, first.lastName, first.userId second = result printf "%s %s %s\n", second.firstName, second.lastName, second.userId
For me one of the coolest things about how this all works is that I can just call these method names on the
result object (which I didn't have to declare anywhere in my Ruby code), and everything just magically (dynamically) works. Very cool.