Ich verwende Ruby-1.8.7-p302 / Rails 2.3.11. Ich versuche, FQL (Facebook API) zu verwenden, um Statistiken für einen Link zu erhalten. Hier ist mein 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
Und hier ist der Fehler:
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
Dies scheint nur im Fall der Facebook-API zu geschehen. Außerdem habe ich in einigen Beiträgen gesehen, dass dies ein Fehler in Net :: HTTP sein könnte.
ruby-on-rails
ruby
web-services
facebook-fql
Rahul Singh
quelle
quelle
Antworten:
Wenn die URL https anstelle von http verwendet, müssen Sie die folgende Zeile hinzufügen:
Beachten Sie die zusätzlichen
http.use_ssl = true
.Der geeignetere Code, der sowohl http als auch https verarbeitet, ähnelt dem folgenden.
Weitere Informationen finden Sie in meinem Blog: EOFError: Problem beim Ende der Datei erreicht, wenn ein Formular mit Net :: HTTP veröffentlicht wird .
quelle
http
und zu verstehenreq
.Ich hatte ein ähnliches Problem mit einer Anfrage an einen Nicht-SSL-Dienst.
In diesem Blog wurde vage vorgeschlagen, die URI-Codierung der URL zu versuchen, die an 'get' übergeben wird: http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
Ich habe aus Verzweiflung einen Versuch unternommen, und in meinen einschränkenden Tests scheint dies das Problem für mich behoben zu haben. Mein neuer Code lautet:
Beachten Sie, dass ich @ http.start verwende, um die HTTP-Sitzung über mehrere Anforderungen hinweg aufrechtzuerhalten. Ansonsten möchten Sie vielleicht den relevantesten Teil ausprobieren, nämlich: URI.encode (url) innerhalb des get-Aufrufs
quelle
Ich stelle fest, dass ich in regelmäßigen Abständen auf solche Net :: HTTP- und Net :: FTP-Probleme stoße. Wenn ich dies tue, verschwinden all diese Probleme, wenn ich den Aufruf mit einem Timeout () umgeben habe. Wo dies also gelegentlich etwa 3 Minuten lang hängt und dann einen EOFError auslöst:
Das behebt es immer für mich:
quelle
Ich hatte das gleiche Problem, ruby-1.8.7-p357, und habe viele Dinge vergeblich ausprobiert ...
Endlich wurde mir klar, dass dies nur bei mehreren Aufrufen mit derselben XMLRPC :: Client-Instanz geschieht!
Jetzt instanziiere ich meinen Client bei jedem Anruf neu und es funktioniert einfach: |
quelle
Nach einigen Recherchen geschah dies in Rubys
XMLRPC::Client
Bibliothek - die verwendetNET::HTTP
. Der Client verwendet diestart()
Methode, mitNET::HTTP
der die Verbindung für zukünftige Anforderungen geöffnet bleibt.Dies geschah genau 30 Sekunden nach den letzten Anforderungen. Daher gehe ich hier davon aus, dass der Server, auf den er trifft, Anforderungen nach dieser Zeit schließt. Ich bin nicht sicher, wie die Standardeinstellung verwendet werden soll
NET::HTTP
, um die Anforderung offen zu halten. Ich werde jedoch 60 Sekunden lang testen, um festzustellen, ob das Problem dadurch behoben wird.quelle
Ich bin kürzlich darauf gestoßen und habe schließlich festgestellt, dass dies durch ein Netzwerk-Timeout vom Endpunkt, den wir erreicht haben, verursacht wurde. Zum Glück konnten wir die Timeout-Dauer verlängern.
Um zu überprüfen, ob dies unser Problem war (und eigentlich kein Problem mit net http), habe ich dieselbe Anfrage mit curl gestellt und bestätigt, dass die Anfrage beendet wurde.
quelle
In Ruby on Rails habe ich diesen Code verwendet und er funktioniert perfekt:
quelle