Подтвердить что ты не робот

Ошибка Ruby Net:: ReadTimeout

Я делаю серию вызовов API с помощью httparty. Первые два вызова API успешно, но третий не удался. Он приостанавливается примерно на 60 секунд (период ожидания по умолчанию), а затем возвращает эту ошибку:

/Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/protocol.rb:158:in `rescue in rbuf_fill': Net::ReadTimeout (Net::ReadTimeout)
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/protocol.rb:152:in `rbuf_fill'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/protocol.rb:134:in `readuntil'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/protocol.rb:144:in `readline'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http/response.rb:39:in `read_status_line'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http/response.rb:28:in `read_new'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1406:in `block in transport_request'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1403:in `catch'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1403:in `transport_request'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1376:in `request'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1369:in `block in request'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:852:in `start'
    from /Users/luigi/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1367:in `request'
    from /Users/luigi/.rvm/gems/[email protected]/gems/httparty-0.12.0/lib/httparty/request.rb:93:in `perform'
    from /Users/luigi/.rvm/gems/[email protected]/gems/httparty-0.12.0/lib/httparty.rb:486:in `perform_request'
    from /Users/luigi/.rvm/gems/[email protected]/gems/httparty-0.12.0/lib/httparty.rb:423:in `get'
    from /Users/jmccann/.rvm/gems/[email protected]/gems/httparty-0.12.0/lib/httparty.rb:518:in `get'

Мой вопрос, почему это происходит? Является ли эта ошибка индикатором ошибки в API или есть что-то, что я могу сделать, чтобы вызвать ее?

Мой код:

Это вызов, который работает:

url = HTTParty.get("https://dev.test.com#{call}",
    :basic_auth => auth,
    :headers => {'Accept' => 'application/json' } )

Это вызов, который не работает:

url = HTTParty.get("https://dev.test.com#{call}",
    :basic_auth => auth,
    :headers => {'Accept' => 'application/json' } )

Единственное, что вообще меняется, - это фактический call, но оба они действительны в соответствии с документацией API.

4b9b3361

Ответ 1

Из документов Ruby: http://ruby-doc.org/stdlib-2.1.2/libdoc/net/http/rdoc/Net/HTTP.html

Число секунд ожидания чтения одного блока (через один вызов (2)). Может использоваться любое число, включая Floats для дробных секунд. Если HTTP-объект не может читать данные за это много секунд, он вызывает исключение Net:: ReadTimeout. Значение по умолчанию - 60 секунд.

Что такое call? Являются ли разные конечные точки обслуживания? Вы просматриваете записи? API часто оценивают лимиты звонков, чтобы предотвратить атаки DDOS. Вы можете попробовать обернуть ваши вызовы api в некоторой логике повтора или добавить некоторый код сна.