12

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 の設定方法を教えてください。そして、Net::HTTPP.start() を介してすべてのサービス呼び出しにそのタイムアウトを使用できるように、グローバルに read_timeout を設定しようとしています。

4

2 に答える 2

20

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見ると、メソッド::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

>= ルビー 1.9

opt 引数で read_timeout を設定できます。 start(address, ..., opt, &block)

このような:

res = Net::HTTP.start(host, port, :read_timeout => 10)
于 2013-03-01T12:51:23.693 に答える
1

openから使えますOpenURI。この方法には: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
于 2013-03-01T12:42:00.753 に答える