休息-在另一个域上使用RESTful Web服务的正确“路线”是什么?

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

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

Mike Farmer asked 2019-11-16T11:22:15Z
5个解决方案
53 votes

我已经在多个项目中使用了一个名为HTTParty的插件/ gem。

[http://johnnunemaker.com/httparty/]

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

最后一点,您也可以在上面使用您的代码,但绝对要将代码包括在模型中,而不是在控制器中。

Kyle Boon answered 2019-11-16T11:23:05Z
26 votes

Restclient是解决此问题的一个非常好的解决方案。

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

从自述文件。

Ethan Heilman answered 2019-11-16T11:23:36Z
11 votes

如果远程RESTful Web服务也是用Ruby on Rails创建的,那么ActiveResource是可行的方法。

Adam Alexander answered 2019-11-16T11:24:00Z
3 votes

为了回应您的Twitter示例,有一个Twitter Gem可以帮助您自动进行此操作。

Adam Alexander answered 2019-11-16T11:24:25Z
1 votes

我认为法拉第在这里值得一提。 真正漂亮的界面和强大的中间件概念。

[https://github.com/lostisland/faraday]

Duke answered 2019-11-16T11:24:56Z
translate from https://stackoverflow.com:/questions/748614/what-is-the-proper-rails-way-to-consume-a-restful-web-service-on-another-domai