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/&quot; # 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