我想从另一个网站获取信息。因此(可能)我应该向该网站发出请求(在我的情况下是HTTP GET请求)并接收响应。
我如何在Ruby on Rails中做到这一点?
如果可能的话,这是在我的控制器中使用的正确方法吗?
我想从另一个网站获取信息。因此(可能)我应该向该网站发出请求(在我的情况下是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),然后简单地从控制器调用它。
如果你在代理后调用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