我想在ruby代码中覆盖服务调用的默认超时。 我在下面打开连接。
res = Net::HTTP.start(@@task_url.host, @@task_url.port) do |http|
http.get("/tasks/#{task_id}")
end
我尝试将read_timeout时间设置为不足,但后来我的代码中出现了NoMethodError异常。
res = Net::HTTP.start(@@task_url.host, @@task_url.port)
res.read_timeout = 10
res do |http|
http.get("/tasks/#{task_id}")
end
建议我如何设置read_timeout。我希望将read_timeout设置为全局,以便我可以通过Net :: HTTPP.start()
将所有服务调用的超时时间用于答案 0 :(得分:16)
如果您使用 Ruby 1.8 ,则必须使用Net::HTTP.new
:
http = Net::HTTP.new(host, port)
http.read_timeout = 10
response = http.get("/")
# or intead of above line if you need block
# http.start do
# response = http.get("/")
# end
如果您查看Net::HTTP.start
的{{3}},您会看到::start
只是使用::new
方法调用#start
:
# File net/http.rb, line 439
def HTTP.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) # :yield: +http+
new(address, port, p_addr, p_port, p_user, p_pass).start(&block)
end
> = Ruby 1.9
您可以在source code中设置read_timeout:
start(address, ..., opt, &block)
res = Net::HTTP.start(host, port, :read_timeout => 10)
答案 1 :(得分:1)
您可以使用OpenURI
中的open
。此方法具有:read_timeout
选项。我不知道如何全局设置选项,但您可以将其包装在设置此选项的自定义函数中。
require 'open-uri'
module NetCustom
def open_url(url, &task)
open(url, :read_timeout => 20) do |file|
yield file.read
end
end
end
用法:
class Foo
include NetCustom
def bar
open_url('http://example.org/tasks/') do |content|
# Handle page text content
end
end
end