如何使用Ruby on Rails进行HTTP请求?

我想从其他网站获取信息。 因此(也许)我应该向该网站发出一个请求(在我的情况下是一个HTTP GET请求)并接收响应。

我怎样才能在Ruby on Rails中做到这一点?

如果可能的话,在我的控制器中使用是否正确?

你可以使用Ruby的Net::HTTP类:

 require 'net/http' url = URI.parse('http://www.example.com/index.html') req = Net::HTTP::Get.new(url.to_s) res = Net::HTTP.start(url.host, url.port) {|http| http.request(req) } puts res.body 

Net :: HTTP是内置于Ruby中的,但让我们面对它,通常不会使用其繁琐的20世纪80年代风格,并尝试更高层次的select:

  • HTTP Gem
  • HTTParty
  • RESTClient实现
  • EXCON
  • Feedjira (仅限RSS)

OpenURI是最好的; 就像…一样简单

 require 'open-uri' response = open('http://example.com').read 
 require 'net/http' result = Net::HTTP.get(URI.parse('http://www.example.com/about.html')) # or result = Net::HTTP.get(URI.parse('http://www.example.com'), '/about.html') 

我比Net :: HTTP更喜欢httpclient 。

 client = HTTPClient.new puts client.get_content('http://www.example.com/index.html') 

如果您正在创build一个服务客户端的类,那么HTTParty是一个不错的select。 这是一个方便的混合,让你90%的需要。 看看Google和Twitter客户端在这个例子中有多短。

并回答你的第二个问题:不,我不会把这个function放在一个控制器中 – 如果可能的话,我会使用一个模型来封装细节(也许使用HTTParty),并简单地从控制器调用它。

我最喜欢的两种方式来获取URL的内容是OpenURI或Typhoeus 。

OpenURI,因为它无处不在,Typhoeus因为它非常灵活和强大。

如果您在代理之后进行REST API调用,以下是可用的代码:

 require "uri" require 'net/http' proxy_host = '<proxy addr>' proxy_port = '<proxy_port>' proxy_user = '<username>' proxy_pass = '<password>' uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>") proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass) req = Net::HTTP::Get.new(uri.path) req.basic_auth(<sauce_username>,<sauce_password>) result = proxy.start(uri.host,uri.port) do |http| http.request(req) end puts result.body