Как указать тайм-аут чтения для запроса Net:: HTTP:: Post.new в Ruby 2

У меня есть сообщение, которое происходит с приложением рельсов из ruby ​​ script. script создает запрос переменной как

request = Net::HTTP::Post.new(url.path)

который затем используется следующим образом

request.content_type = "application/json"    
request.body =  JSON.generate( params )

response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}

На сервере много обработки, и я получаю ошибку Net::ReadTimeout

Я попытался указать период ожидания

request.read_timeout = 500

как qaru.site/info/379444/..., но я получил

undefined method `read_timeout=' for #<Net::HTTP::Post POST> (NoMethodError)

ошибка. Я предполагаю, что я что-то пропустил где-то. Все подсказки с благодарностью получили

Техническая информация:

  • Ruby 2.0.0p247
  • Rails 4.0.0
  • Windows 7 32-bit ruby ​​

Ответы

Ответ 1

Решено через fooobar.com/questions/379441/...

Я изменил свой

response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}

строка

response = Net::HTTP.start(url.host, url.port, :read_timeout => 500) {|http| http.request(request)}

и это, похоже, обошло эту проблему.

Ответ 2

read_timeout доступен с простым объектом Net::HTTP:

url = URI.parse('http://google.com')

http = Net::HTTP.new(url.host, url.port)
http.read_timeout = 5 # seconds

http.request_post(url.path, JSON.generate(params)) do |response|
  # do something with response
  p response
end

Ответ 3

Если кто-то все еще сталкивается с проблемой времени ожидания и Net::HTTP тайм-аут работает не так, как ожидалось, вы также можете подходить к подходу:

begin
    Timeout::timeout(10) {
        ####
        ## YOUR REQUEST CODE WILL BE HERE
        ####
    }
rescue
    408
end