Я взломал это вместе как, казалось бы, надежный способ называть сломанный веб-сервис, который давал таймауты и случайное разрешение имен или сокетную ошибку или что-то еще. Я думал, что положу это здесь, если это будет полезно или, скорее, будет сказано, что это лучший способ сделать это.
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)
Сердце этого вопроса: Какие все исключения я должен искать при звонке в веб-сервис, как это? Вот попытка собрать их всех, но похоже, что это лучший способ: http://tammersaleh.com/posts/rescuing-net-http-exceptions