我想从另一个网站获取信息。因此(可能)我应该向该网站发出请求(在我的情况下是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 < / >强类:
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