Ruby on rails 什么是正确的;轨道;在另一个域上使用RESTful web服务?

Ruby on rails 什么是正确的;轨道;在另一个域上使用RESTful web服务?,ruby-on-rails,rest,Ruby On Rails,Rest,我想编写一个RubyonRails应用程序,它使用RESTfulWeb服务API对结果执行一些逻辑,然后在我的视图中显示数据。例如,假设我想编写一个程序,在search.twitter.com上进行搜索。使用纯ruby,我可以创建以下方法: def run(search_term='', last_id=0) @results = [] url = URI.parse("http://search.twitter.com") res = Net::HTTP.start(url.hos

我想编写一个RubyonRails应用程序,它使用RESTfulWeb服务API对结果执行一些逻辑,然后在我的视图中显示数据。例如,假设我想编写一个程序,在search.twitter.com上进行搜索。使用纯ruby,我可以创建以下方法:

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”的方法可以做到这一点。有最佳实践方法吗?或者这真的是最佳方法吗?

如果远程RESTful web服务也是用Ruby on Rails创建的,那么这就是最好的方法

对于您的Twitter示例,有一个插件可以帮助您实现自动化。

有一个名为HTTParty的插件/gem,我已经在几个项目中使用过

HTTParty允许您轻松使用任何web服务,并将结果解析为哈希值。然后,您可以使用散列本身,或者用结果实例化一个或多个模型实例。我两方面都做过

对于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')
最后一点,您也可以使用上面的代码,但一定要将代码包含在模型中,而不是控制器中

是解决这个问题的好办法

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

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


我无法做出这样的假设,因为我想从许多不同的网站中提取数据,而这些网站的底层框架是什么我都不知道。但我会在ActiveResource中查找我知道的Rails。谢谢实际上,远程RESTful服务不必使用Rails创建,ActiveResource才能工作。底层实现并不重要,这绝对是Rails首选的使用RESTful资源的方式。保持代码干净,符合MVC。我喜欢这个gem。这使得消费web服务变得非常流畅。但我仍然有一个问题,Rails是否已经内置了一些东西来实现这一点?似乎这是一件很常见的事情,他们会有办法做到。另外,请原谅我的Rails Noobie:),我将如何将其设置为一个模型。我只使用了使用ActiveRecord访问数据库的模型,rails核心没有内置任何东西。模型只是一个类-只需在models目录中创建一个类,而不从ActiveRecord:基类继承。您不会包含任何AR功能,但这是在rails应用程序中使用web服务的一种非常常见的模式。谢谢!我试试看。我非常感谢您的帮助。我现在已经开始使用restclient来处理这类事情,因为HttpParty已经过时,restclient更容易使用。我非常同意restclient。这是一个处理所有API调用的非常棒的框架。非常棒的东西。来自iOS,这正是我想要的。我非常喜欢RestClient而不是HttpParty。对我来说,感觉更脚踏实地,没有那么神奇。YMMV