相关疑难解决方法(0)

在Ruby Net :: HTTP.start中为服务调用设置read_timeout

我想在我的ruby代码中覆盖服务调用的默认超时.我打开连接.

res = Net::HTTP.start(@@task_url.host, @@task_url.port) do |http|
    http.get("/tasks/#{task_id}")
end          
Run Code Online (Sandbox Code Playgroud)

我尝试将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
Run Code Online (Sandbox Code Playgroud)

建议我如何设置read_timeout.我希望将read_timeout设置为全局,以便我可以通过Net :: HTTPP.start()将该超时用于我的所有服务调用

ruby ruby-on-rails

12
推荐指数
1
解决办法
1万
查看次数

强力调用一个片状API:使用Net :: HTTP进行适当的错误处理

我把它一起作为一种表面上看起来很健壮的方式来调用一个不稳定的web服务,它会给出超时和偶尔的名称解析或套接字错误等等.我想我会把它放在这里以防它有用,或者更有可能被告知更好的方法来做到这一点.

require 'net/http'

retries = 5
begin
  url = URI.parse('http://api.flakywebservice.com')
  http = Net::HTTP.new(url.host, url.port)
  http.read_timeout = 600  # be very patient
  res = nil
  http.start{|http|
    req = Net::HTTP::Post.new(url.path)
    req.set_form_data(params)  # send a hash of the POST parameters
    res = http.request(req)
  }
rescue Exception   # should really list all the possible http exceptions
  sleep 3
  retry if (retries -= 1) > 0
end

# finally, do something with res.body, like JSON.parse(res.body)
Run Code Online (Sandbox Code Playgroud)

这个问题的核心是:在打电话给这样的网络服务时,我应该寻找所有例外情况?这是尝试收集所有这些,但似乎必须有一个比这更好的方法:http: //tammersaleh.com/posts/rescuing-net-http-exceptions

ruby api web-services http

10
推荐指数
1
解决办法
3387
查看次数

'在rbuf_fill中救援':超时::错误(超时::错误)

相同的脚本不同的错误 这可能与我的网络而不是我的代码有关.脚本如下:

#!/usr/bin/env ruby -rubygems

require File.join(File.dirname(__FILE__), 'authentication')

require "csv" # faster_csv (ruby 1.9)

lines = CSV.read(File.join(File.dirname(__FILE__), 'karaoke.csv')) # Exported an Excel file as CSV

lines.slice!(0) # remove header line

collection = StorageRoom::Collection.find('collection ID')
Song = collection.entry_class

lines.each do |row|
  karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov"))

  if karaoke.save
    puts "Song saved: #{karaoke.artist}, #{karaoke.song}, #{karaoke.genre}"
  else
    puts "Song could not be saved: #{karaoke.errors.join(', ')}"
  end
end
Run Code Online (Sandbox Code Playgroud)

错误是:

/usr/local/lib/ruby/1.9.1/net/protocol.rb:140:in `rescue in rbuf_fill': Timeout::Error (Timeout::Error) …
Run Code Online (Sandbox Code Playgroud)

ruby

10
推荐指数
1
解决办法
1万
查看次数

使用Rails在Net :: HTTP :: Get.new中设置自定义超时

我正在使用此代码来抓取外部html文件

link = URI.parse(url)
request = Net::HTTP::Get.new(link.path)
response = Net::HTTP.start(link.host, link.port) {|http|
  http.request(request)
}
Run Code Online (Sandbox Code Playgroud)

效果很好,但网页速度慢有时会响应超时,所以我需要为每个连接设置一个超时限制.任何的想法?

http ruby-on-rails-3 ruby-on-rails-4

6
推荐指数
1
解决办法
8611
查看次数