web-dev-qa-db-fra.com

Ruby error Net :: ReadTimeout

Je fais une série d'appels API en utilisant httparty. Les deux premiers appels API réussissent, mais le troisième échoue. Il s'arrête pendant environ 60 secondes (délai d'expiration par défaut), puis renvoie cette erreur:

/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/Ruby-2.0.0-p247@pdf/gems/httparty-0.12.0/lib/httparty/request.rb:93:in `perform'
    from /Users/luigi/.rvm/gems/Ruby-2.0.0-p247@pdf/gems/httparty-0.12.0/lib/httparty.rb:486:in `perform_request'
    from /Users/luigi/.rvm/gems/Ruby-2.0.0-p247@pdf/gems/httparty-0.12.0/lib/httparty.rb:423:in `get'
    from /Users/jmccann/.rvm/gems/Ruby-2.0.0-p247@pdf/gems/httparty-0.12.0/lib/httparty.rb:518:in `get'

Ma question est pourquoi cela se produit-il? Cette erreur indique-t-elle une erreur avec l'API, ou est-ce que je pourrais faire quelque chose pour la provoquer?

Mon code:

C'est l'appel qui fonctionne:

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

C'est l'appel qui ne fonctionne pas:

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

La seule chose qui change du tout est le call réel, mais ce sont deux appels valides selon la documentation de l'API.

21
Luigi

À partir des documents Ruby: http://Ruby-doc.org/stdlib-2.1.2/libdoc/net/http/rdoc/Net/HTTP.html

Nombre de secondes pour attendre la lecture d'un bloc (via un appel de lecture (2)). N'importe quel nombre peut être utilisé, y compris les flottants pendant quelques secondes. Si l'objet HTTP ne peut pas lire les données dans ce nombre de secondes, il déclenche une exception Net :: ReadTimeout. La valeur par défaut est 60 secondes.

Qu'est-ce que call? Les points de terminaison de service sont-ils différents? Recherchez-vous des enregistrements? Les API évaluent souvent la limite des appelants pour empêcher les attaques DDOS. Vous pouvez essayer d'encapsuler vos appels API dans une logique de nouvelle tentative ou d'ajouter du code de veille.

15
jaysqrd