Simple Web Service

I’m trying to write my first web service, essentially it’s “hello
world”.

I have an api:

class BackendApi < ActionWebService::API::Base
api_method :test,
:returns => [[:string]]
end

a service controller:

class BackendController < ApplicationController
wsdl_service_name ‘backend’
web_service_scaffold :invoke

def test
return [“hello”,“world”]
end
end

and a client controller

class DrawingsController < ApplicationController

web_client_api :backend, :soap, “http://localhost:3000/backend/api
def index
x = backend.test
render_text “success”
end
end

As you can see from above this is running locally, and on a Webrick
server. If I exercise the service using
http://localhost:3000/backend/invoke it works fine. However if I use
the client, as in http://localhost:3000/drawings (using the index), it
just times out:

Here’s the trace:
/usr/lib/ruby/1.8/timeout.rb:54:in parse_header' /usr/lib/ruby/1.8/timeout.rb:56:in timeout’
/usr/lib/ruby/1.8/timeout.rb:76:in timeout' /usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:1464:in parse_header’
/usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:1422:in
read_header' /usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:1254:in get_status’
/usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:466:in
do_get_header' /usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:436:in do_get_block’
/usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:370:in
conn_request' /usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:285:in request’
/usr/lib/ruby/gems/1.8/gems/rubyforge-0.3.1/lib/http-access2.rb:264:in
post' /usr/lib/ruby/1.8/soap/streamHandler.rb:170:in send_post’
/usr/lib/ruby/1.8/soap/streamHandler.rb:109:in send' /usr/lib/ruby/1.8/soap/rpc/proxy.rb:170:in route’
/usr/lib/ruby/1.8/soap/rpc/proxy.rb:141:in call' /usr/lib/ruby/1.8/soap/rpc/driver.rb:178:in call’
/usr/lib/ruby/1.8/soap/rpc/driver.rb:232:in test' /usr/lib/ruby/gems/1.8/gems/actionwebservice-1.1.2/lib/action_web_service/client/soap_client.rb:61:in perform_invocation’
/usr/lib/ruby/gems/1.8/gems/actionwebservice-1.1.2/lib/action_web_service/client/base.rb:15:in
method_missing' #{RAILS_ROOT}/app/controllers/drawings_controller.rb:7:in index’

Can anyone spot what I’m doing wrong here? I’m going by the Agile book
and this part is a little lite on examples.

Thanks,

Gary

<ghuntress@…> writes:

Can anyone spot what I’m doing wrong here? I’m going by the Agile book and
this part is a little lite on examples.

Thanks,

Gary

Don’t worry, it’s not an error you could really have predicted. The
problem is
webrick’s.

Webrick can only support one concurrent connection, whereas your
scenario
depends on having two connections processed simultaneously - the request
you
make to your browser and the internal request the SOAP client is making.

The browser request is made first, but can’t finish until the internal
request
finishes, however the internal request can’t be handled until the
browser
request is dealt with. Deadlock.

The simplest way around it is to run another server and have your SOAP
requests
pointed at there instead.ea

Gareth