Rails HTTP Ping到不可靠的目标

时间:2016-01-16 17:14:48

标签: ruby-on-rails ruby http heroku client

我想向IP地址和端口发送HTTP GET请求,以确定是否有可以在该地址响应的在线设备。

我希望有一个相对合理的超时,以便我的应用程序在连接时不会挂起,如果没有。我一直在使用Net::HTTP,但是在使用IP地址时似乎没有办法设置超时。

res = Net::HTTP.get_response(ip_address, '/index.html', port)

在使用IP地址而不是域名时,是否有最佳做法或更好的方法来执行此请求或在Net::HTTP中设置超时?

我使用Ruby 2.1.5和Rails 4.1.0在Heroku上托管。

3 个答案:

答案 0 :(得分:1)

您可以看到HTTParty gem。这个宝石提供了许多选项,并且易于使用。

您为请求设置超时以返回响应

response = HTTParty.get('https://www.google.co.in/', timeout: 60)

超时以秒为单位。

或在Net http中,您可以设置为,

uri = URI.parse(ip_address + '/index.html')
request = Net::HTTP::Get.new(uri.path)
begin
  response = Net::HTTP.start(uri.host, uri.port) {|http|
    http.read_timeout = 100 #Default is 60 seconds
    http.request(request)
  }
rescue Net::ReadTimeout => e  
   puts e.message
end

答案 1 :(得分:0)

不确定您在寻找什么。在Net::HTTP - 类中有read_timeout - setter。见这里:http://docs.ruby-lang.org/en/2.1.0/Net/HTTP.html#method-i-read_timeout-3D

答案 2 :(得分:0)

通过ip地址或dns名称请求之间没有什么重大区别,在后一种情况下进行DNS查询,通常设置Host - 标头,然后通过ip完成请求。

Net::HTTP open_timeout设置中,如果在此期间无法建立连接,则会设置Net::OpenTimeout。默认情况下,它是nil,意思是“永远”