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

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

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

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

282945 次浏览
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中,但让我们面对它,通常更容易使用其笨重的1980年代风格,并尝试更高级别的替代方案:

我更喜欢httpclient而不是Net::HTTP。

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

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

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

我最喜欢的两种抓取url内容的方法是OpenURI堤福俄斯

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