什么是适当的“Rails方式”在另一个域上使用RESTful Web服务?

我想编写一个Ruby on Rails应用程序,它使用RESTful Web服务API对结果执行一些逻辑,然后在我的视图上显示这些数据。 例如,假设我想编写一个在search.twitter.com上search的程序。 使用纯ruby,我可能会创build以下方法:

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 

我试图把这个方法作为一个私有方法放到我的Rails控制器中,但我认为有一个更好的,更“Rails”的方法来做到这一点。 有一个最佳实践方法,或者这是最好的方法吗?

有一个名为HTTParty的插件/ gem,我已经用于几个项目。

http://johnnunemaker.com/httparty/

通过HTTParty,您可以轻松使用任何Web服务,并将结果parsing为散列。 然后你可以使用散列本身或者用结果实例化一个或多个模型实例。 我已经做到了这一点。

对于twitter示例,您的代码如下所示:

 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') 

作为最后一点,你也可以使用上面的代码,但肯定包含代码在模型中,而不是控制器。

Restclient是一个非常好的解决这个问题的方法。

 require 'rest_client' RestClient.get 'http://example.com/resource' RestClient.get 'http://example.com/resource', {:params => {:id => 50, 'foo' => 'bar'}} 

从自述 。

如果远程RESTful Web服务也是使用Ruby on Rails创build的,那么ActiveResource就是要走的路。

为了回应你的Twitter示例,有一个Twitter的gem ,这将有助于为你自动化。

我认为法拉第在这里值得一提。 非常好的界面,强大的中间件概念。

https://github.com/lostisland/faraday