Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the proper "Rails Way" to consume a RESTful web service on another domain?

I would like to write a Ruby on Rails application that consumes a RESTful web service API performs some logic on the result and then displays that data on my view. For example, let's say I wanted to write a program that did a search on search.twitter.com. Using pure ruby I might create the following method:

def run(search_term='', last_id=0)   @results = []   url = URI.parse("http://search.twitter.com")   res = Net::HTTP.start(url.host, url.port) do |http|     http.get("/search.json?q=#{search_term}&since_id=#{last_id.to_s}")   end   @results = JSON.parse res.body end 

I'm tempted to just drop that method into my Rails controller as a private method, but part of me thinks that there is a better, more "Rails" way to do this. Is there a best practice approach or is this really the best way?

like image 799
Mike Farmer Avatar asked Apr 14 '09 17:04

Mike Farmer


People also ask

How do I consume RESTful web services?

Create a simple Spring Boot web application and write a controller class files which is used to redirects into the HTML file to consumes the RESTful web services. We need to add the Spring Boot starter Thymeleaf and Web dependency in our build configuration file. For Maven users, add the below dependencies in your pom.

What is RESTful API rails?

Building a RESTful API A REST API uses RESTful routing just like the routing we've already used in our Rails applications. It's also stateless, which means our API application and the applications our API communicates with don't need to know about each other's state.


1 Answers

There is a plugin/gem called HTTParty that I've used for several projects.

http://johnnunemaker.com/httparty/

HTTParty lets you easily consume any web service and parses results into a hash for you. Then you can use the hash itself or instantiate one or more model instances with the results. I've done it both ways.

For the twitter example, your code would look like this:

class Twitter   include HTTParty   base_uri 'twitter.com'    def initialize(u, p)     @auth = {:username => u, :password => p}   end    # which can be :friends, :user or :public   # options[:query] can be things like since, since_id, count, etc.   def timeline(which=:friends, options={})     options.merge!({:basic_auth => @auth})     self.class.get("/statuses/#{which}_timeline.json", options)   end    def post(text)     options = { :query => {:status => text}, :basic_auth => @auth }     self.class.post('/statuses/update.json', options)   end end  # usage examples. twitter = Twitter.new('username', 'password') twitter.post("It's an HTTParty and everyone is invited!") twitter.timeline(:friends, :query => {:since_id => 868482746}) twitter.timeline(:friends, :query => 'since_id=868482746') 

As a last point, you could use your code above also, but definitely include the code in a model as opposed to a controller.

like image 166
Kyle Boon Avatar answered Sep 21 '22 09:09

Kyle Boon