Call Rest webservice in Ruby on Rails

Hi every body,

I use rest web service in my rails application for user's
authentication (user creation, login, ...)
Can someone explain me, how can i call a REST Web service (not
developped in Rails, and deployed by Tomcat) in my rails application
via POST method.

Thanks in advance for your help

I use the Ruby Net::HTTP library to construct requests.

Best regards,

I've just used:

data = `curl -data xxx url`

That doesn't seem like the "right" way, but it works.

You should also read up on ActiveResource.

Define a class like this in your models folder

class MyUserWS < ActiveResource::Base = "http://localhost/" # point this to the location of
your web service
    self.format = :json # default format is xml.
include this line if you want json
    self.element_name = "users" # if your class name (MyUserWS in
this case) is different from the name of the webservice you are
calling, Mention the real name here
    self.user = "" # if your webserive need user
authentication mention user name and password
    self.password = "mypassword"

Once you have this... you can instanciate MyUserWS as if it is a model
on local database table. You can do all activerecord operations on it
as you do on your models


Thanks to all for your answer.
Bill, can you show me please how you you use the NET::HTTP library to
call web service.

Because i have used the NET::HTTP libray like the following, but i
alway got 405 error and web service is not called.
I have the signup method in my user controller!

def signup
      require "net/http"
      require "uri"

      uri = URI.parse("myWebServiceUrl")
      http =, uri.port)

      request =
      request.set_form_data({ "password" =>
"MyPassword","firstname"=>"yourFirstname", "lastname"=>"yourLatsname",
      response, data = http.request(request)

      render :text => "#{data}"

Thanks for your help


To send data from an action I do this:

def send_mydata
  uri = URI.parse(link)
  net_http =, uri.port)
  net_http.open_timeout = timeout
  net_http.read_timeout = timeout
  net_http.use_ssl = (uri.scheme == 'https')# enable SSL/TLS
  if net_http.use_ssl?
    net_http.cert =
    net_http.key =
    net_http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  self.response_body = proc do |response, output|
    net_http.start do |http|
      http.request_get(uri.request_uri()) do |res|
        case res
          when Net::HTTPSuccess then
            res.read_body do |segment|
          when Net::HTTPRedirection then
            response.close() unless response.closed?
            raise "Net::HTTPResponse error: #{res.message.to_s()}"

How can i set parameters in this case?



I never tried this, but it should be something like this:

  required_parameters = ["param1=value1", "param2=value2"]
  self.response_body = proc do |response, output|
    net_http.start do |http|
      http.get(uri.path + '?' + required_parameters.join('&'))
        case res

Maybe, you need to "escape" the required parameters.


Allow me to second the recommendation to read up on ActiveResource - this is exactly what it’s designed for, and in fact if you’re also developing the ReST API, you can use ActiveResource to impose convention (over configuration) in your API - plus you’ll have a nice test rig when you’re done.

Only issue is whether enough people in the Ruby community see AR this way and whether it will continue to be maintained.