Peter Michaux
2006-Feb-20 01:25 UTC
[Rails] Trouble connecting to a Rails SOAP web service with a simple Ruby client
Hi,
The code for my Rails webservice is below. It working just fine
through the Rails web service scaffold invoke
http://localhost:3000/ProductBackend/invoke
I''m trying to write a plain ruby command line client to access the
webservice.
require ''soap/rpc/driver''
proxy = SOAP::RPC::Driver.new("http://localhost:3000/product_backend",
"urn:ActionWebService")
proxy.add_method(''find_product_by_id'', ''id'')
puts "Product: #{proxy.find_product_by_id(2).name}"
I also tried http://localhost:3000/ProductBackend
I see the following
$ ruby client.rb
/usr/local/lib/ruby/1.8/soap/streamHandler.rb:270:in `send_post'': 404:
Not Found (SOAP::HTTPStreamError)
from /usr/local/lib/ruby/1.8/soap/streamHandler.rb:103:in
`send''
from /usr/local/lib/ruby/1.8/soap/rpc/proxy.rb:114:in `invoke''
from /usr/local/lib/ruby/1.8/soap/rpc/proxy.rb:131:in `call''
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:275:in `call''
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:302:in
`find_product_by_id''
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:297:in
`find_product_by_id''
from client.rb:4
What''s wrong?
Thanks,
Peter
############## app/controllers/product_backend_controller.rb ##############
class ProductBackendController < ApplicationController
wsdl_service_name ''ProductBackend''
web_service_api ProductBackendApi
web_service_scaffold :invoke
def find_product_by_id(id)
Product.find(id)
end
end
############## app/apis/product_backend_api.rb ##############
class ProductBackendApi < ActionWebService::API::Base
api_method :find_product_by_id,
:expects => [:int],
:returns => [Product]
end
Peter Michaux
2006-Feb-20 01:26 UTC
[Rails] Re: Trouble connecting to a Rails SOAP web service with a simple Ruby client
In case it helps here are the XML request and responses
Request XML:
<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Body>
<n1:FindProductById xmlns:n1="urn:ActionWebService"
env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<param0 xsi:type="xsd:int">1</param0>
</n1:FindProductById>
</env:Body>
</env:Envelope>
Response XML:
<?xml version="1.0" encoding="UTF-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Body>
<n1:FindProductByIdResponse xmlns:n1="urn:ActionWebService"
env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="n1:Product">
<id xsi:type="xsd:int">1</id>
<name xsi:type="xsd:string">gamma</name>
<description xsi:type="xsd:string">An all time
classic.</description>
</return>
</n1:FindProductByIdResponse>
</env:Body>
</env:Envelope>
Peter Michaux
2006-Feb-20 03:40 UTC
[Rails] Re: Trouble connecting to a Rails SOAP web service with a simple Ruby client
I found out a little more but still am getting an error.
My client
require ''soap/rpc/driver''
proxy =
SOAP::RPC::Driver.new("http://localhost:3000/ProductBackend/api",
"urn:ActionWebService")
proxy.add_method(''find_product_by_id'')
puts "Product: #{proxy.find_product_by_id(2).name}"
Produces
$ ruby client.rb
/usr/local/lib/ruby/1.8/soap/rpc/driver.rb:300:in
`find_product_by_id'': wrong number of arguments (1 for 0)
(ArgumentError)
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:297:in
`find_product_by_id''
from client.rb:6
and if I remove the 2 in the call to proxy.find_product_by_id so there
are no arguments (which is wrong, of course)
$ ruby client.rb
/usr/local/lib/ruby/1.8/soap/rpc/proxy.rb:132:in `call'': undefined
method `header'' for nil:NilClass (NoMethodError)
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:275:in `call''
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:302:in
`find_product_by_id''
from /usr/local/lib/ruby/1.8/soap/rpc/driver.rb:297:in
`find_product_by_id''
from client.rb:6