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[0]
printf "%s %s %s\n", first.firstName, first.lastName, first.userId
second = result[1]
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.

