问题
I'm using Ruby 1.9.3 and need to GET a URL. I have this working with Net::HTTP
, however, if the site is down, Net::HTTP
ends up hanging.
While searching the internet, I've seen many people faced similar problems, all with hacky solutions. However, many of those posts are quite old.
Requirements:
- I'd prefer using
Net::HTTP
to installing a new gem. - I need both the Body and the Response Code. (e.g. 200)
- I do not want to
require open-uri
, since that makes global changes and raises some security issues. - I need to GET a URL within X seconds, or return error.
Using Ruby 1.9.3, how can I GET a URL while setting a timeout?
To clarify, my existing code looks like:
Net::HTTP.get_response(URI.parse(url))
Trying to add:
Net::HTTP.open_timeout(1000)
Results in:
NoMethodError: undefined method `open_timeout' for Net::HTTP:Class
回答1:
You can set the open_timeout attribute of the Net::HTTP
object before making the connection.
uri = URI.parse(url)
Net::HTTP.new(uri.hostname, uri.port) do |http|
http.open_timeout = 1000
response = http.request_get(uri.request_uri)
end
回答2:
I tried all the solutions here and on the other questions about this problem but I only got everything right with the following code, The open-uri gem is a wrapper for net::http. I needed a get that had to wait longer than the default timeout and read the response. The code is also simpler.
require 'open-uri'
open(url, :read_timeout => 5 * 60) do |response|
if response.read[/Return: Ok/i]
log "sending ok"
else
raise "error sending, no confirmation received"
end
end
来源:https://stackoverflow.com/questions/24387405/setting-an-http-timeout-in-ruby-1-9-3