J’utilise ruby-1.8.7-p302 / Rails 2.3.11. J’essaie d’utiliser fql (facebook api) pour obtenir des statistiques pour un lien. Voici mon code:
def stats(fb_post_url) url = BASE_URI + "?query=#{URI.encode("select like_count from link_stat where url=\"#{fb_post_url}\"")}" parsed_url = URI.parse(url) http = Net::HTTP.new(parsed_url.host, parsed_url.port) request = Net::HTTP::Get.new(parsed_url.request_uri) response = http.request(request) response.inspect end
et voici l’erreur:
EOFError: end of file reached from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `sysread' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:67:in `timeout' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:101:in `timeout' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:116:in `readuntil' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:126:in `readline' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2028:in `read_status_line' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2017:in `read_new' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1051:in `request' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1037:in `request' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:543:in `start' from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1035:in `request' from /home/rahul/Work/Radr/lib/fb_stats.rb:13:in `stats' from (irb):10
Cela semble se produire uniquement dans le cas de l’api facebook. En outre, je l’ai vu suggéré dans certains articles, cela pourrait être un bogue dans Net :: HTTP.
Si l’URL utilise https au lieu de http, vous devez append la ligne suivante:
parsed_url = URI.parse(url) http = Net::HTTP.new(parsed_url.host, parsed_url.port) http.use_ssl = true
Notez le http.use_ssl = true
supplémentaire.
Et le code plus approprié qui traiterait à la fois http et https sera similaire à celui-ci.
url = URI.parse(domain) req = Net::HTTP::Post.new(url.request_uri) req.set_form_data({'name'=>'Sur Max', 'email'=>'some@email.com'}) http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") response = http.request(req)
Voir plus dans mon blog: EOFError : problème de fin de fichier atteint lors de la publication d’un formulaire avec Net :: HTTP .
J’ai eu un problème similaire avec une demande à un service non-SSL.
Ce blog a suggéré vaguement d’essayer l’URI encodant l’URL transmise à ‘get’: http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
Je me suis attaqué à cela, basé sur le désespoir, et dans mes tests de limitation, cela semble avoir été corrigé pour moi. Mon nouveau code est le suivant:
@http = Net::HTTP.new('domain.com') @http = @http.start url = 'http://domain.com/requested_url?blah=blah&etc=1' req = Net::HTTP::Get.new(URI.encode(url)) req.basic_auth USERNAME, API_KEY res = @http.request(req)
Notez que j’utilise @ http.start car je souhaite conserver la session HTTP sur plusieurs requêtes. En dehors de cela, vous pouvez essayer la partie la plus pertinente qui soit: URI.encode (url) dans l’appel à recevoir
J’ai eu le même problème, ruby-1.8.7-p357, j’ai essayé plein de choses en vain …
J’ai finalement réalisé que cela ne se produit que sur plusieurs appels utilisant la même instance XMLRPC :: Client!
Alors maintenant, je ré-installe mon client à chaque appel et ça marche: |
Je trouve que je rencontre régulièrement des problèmes avec Net :: HTTP et Net :: FTP, et lorsque je le fais, entourer l’appel avec un timeout () fait disparaître tous ces problèmes. Donc, où cela peut occasionnellement se bloquer pendant environ 3 minutes, puis élever une erreur EOFE:
res = Net::HTTP.post_form(uri, args)
Cela le fixe toujours pour moi:
res = timeout(120) { Net::HTTP.post_form(uri, args) }
Après quelques recherches, cela se passait dans la bibliothèque XMLRPC::Client
de Ruby – qui utilise NET::HTTP
. Le client utilise la méthode start()
dans NET::HTTP
qui maintient la connexion ouverte pour les demandes futures.
Cela s’est produit précisément 30 secondes après les dernières requêtes – Donc, je suppose ici que le serveur qu’il frappe ferme les requêtes après cette heure. Je ne suis pas sûr de la valeur par défaut de NET::HTTP
pour garder la requête ouverte – mais je suis sur le sharepoint tester avec 60 secondes pour voir si cela résout le problème.
En rails j’ai utilisé ce code et ça marche parfaitement
req_profilepic = ActiveSupport::JSON.decode(open(URI.encode("https://graph.facebook.com/me/?fields=picture&type=large&access_token=#{fb_access_token}"))) profilepic_url = req_profilepic['picture']
J’espère que ça vous aide 🙂