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,
Bill

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
    self.site = "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 = "myself@elitmus.com" # if your webserive need user
authentication mention user name and password
    self.password = "mypassword"
end

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

Regards
Shireesh

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"

      user= User.new(params[:firstname],
params[:lastname],params[:password],params[:mobilenumber],params[:email])
      uri = URI.parse("myWebServiceUrl")
      http = Net::HTTP.new(uri.host, uri.port)

      request = Net::HTTP::Post.new(uri.request_uri)
      request.set_form_data({ "password" =>
"MyPassword","firstname"=>"yourFirstname", "lastname"=>"yourLatsname",
"email"=>"email@yahoo.com","mobilenumber"=>"1234567890"})
      response, data = http.request(request)

      render :text => "#{data}"
  end

Thanks for your help

Hi,

To send data from an action I do this:

def send_mydata
  ...
  uri = URI.parse(link)
  net_http = Net::HTTP.new(uri.host, 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 =
OpenSSL::X509::Certificate.new(File.read(cert_path))
    net_http.key = OpenSSL::PKey::RSA.new(File.read(key_path))
    net_http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end

  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|
              response.write(segment)
            end
          when Net::HTTPRedirection then
            response.close() unless response.closed?
            return
          else
            raise "Net::HTTPResponse error: #{res.message.to_s()}"
         end
      end
    end
  end
end

Hi,
How can i set parameters in this case?

Thanks

Hi,

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.

Cheers.

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.

m