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

我如何在Ruby on Rails中做到这一点?

如果可能的话,这是在我的控制器中使用的正确方法吗?


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

你可以使用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中,但让我们面对它,通常不使用其笨重的80年代风格,而是尝试更高级别的替代方案更容易:

HTTP的宝石 HTTParty RestClient Excon Feedjira(仅限RSS)


比起Net::HTTP,我更喜欢httpclient。

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

如果你要创建一个类作为服务的客户端,HTTParty是一个很好的选择。这是一个方便的混合,可以提供你所需的90%。在示例中查看谷歌和Twitter客户端有多短。

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


我最喜欢的抓取url内容的两种方法是OpenURI或Typhoeus。

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


OpenURI是最好的;这很简单

require 'open-uri'
response = open('http://example.com').read

如果你在代理后调用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