Saya menggunakan ruby-1.8.7-p302 / Rails 2.3.11. Saya mencoba menggunakan FQL (Facebook API) untuk mendapatkan statistik tautan. Ini kode saya:
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
Dan inilah kesalahannya:
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
Ini sepertinya hanya terjadi pada API Facebook. Juga, saya melihatnya disarankan dalam beberapa posting ini bisa menjadi bug di Net :: HTTP.
ruby-on-rails
ruby
web-services
facebook-fql
Rahul Singh
sumber
sumber
Jawaban:
Jika URL menggunakan https alih-alih http, Anda perlu menambahkan baris berikut:
Perhatikan tambahannya
http.use_ssl = true
.Dan kode yang lebih tepat yang akan menangani http dan https akan mirip dengan yang berikut.
Lihat lebih banyak di blog saya: EOFError: masalah akhir file saat mengirim formulir dengan Net :: HTTP .
sumber
http
danreq
.Saya memiliki masalah serupa dengan permintaan ke layanan non-SSL.
Blog ini menyarankan untuk mencoba URI menyandikan URL yang dilewatkan ke 'get': http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
Saya mengambil kesempatan itu, berdasarkan pada keputusasaan, dan dalam pengujian saya yang terbatas ini sepertinya telah memperbaikinya untuk saya. Kode baru saya adalah:
Perhatikan bahwa saya menggunakan @ http.start karena saya ingin mempertahankan sesi HTTP melalui beberapa permintaan. Selain itu, Anda mungkin ingin mencoba bagian yang paling relevan yaitu: URI.encode (url) di dalam panggilan masuk
sumber
Saya menemukan bahwa saya mengalami Net :: HTTP dan Net :: FTP masalah seperti ini secara berkala, dan ketika saya melakukannya, seputar panggilan dengan batas waktu () membuat semua masalah tersebut hilang. Jadi di mana ini kadang-kadang akan menggantung selama 3 menit atau lebih dan kemudian meningkatkan EOFError:
Ini selalu memperbaikinya untuk saya:
sumber
Saya memiliki masalah yang sama, ruby-1.8.7-p357, dan mencoba banyak hal dengan sia-sia ...
Saya akhirnya menyadari bahwa itu hanya terjadi pada beberapa panggilan menggunakan XMLRPC :: Klien contoh yang sama!
Jadi sekarang saya kembali instantiating klien saya di setiap panggilan dan hanya berfungsi: |
sumber
Setelah melakukan beberapa penelitian, ini terjadi di
XMLRPC::Client
perpustakaan Ruby - yang menggunakanNET::HTTP
. Klien menggunakanstart()
metodeNET::HTTP
yang membuat koneksi tetap terbuka untuk permintaan di masa mendatang.Ini terjadi tepat pada 30 detik setelah permintaan terakhir - jadi asumsi saya di sini adalah bahwa server yang dipukulnya sedang menutup permintaan setelah waktu itu. Saya tidak yakin untuk apa defaultnya
NET::HTTP
agar permintaan tetap terbuka - tapi saya akan menguji dengan 60 detik untuk melihat apakah itu menyelesaikan masalah.sumber
Saya mengalami ini baru-baru ini dan akhirnya menemukan bahwa ini disebabkan oleh batas waktu jaringan dari titik akhir yang kami tekan. Untungnya bagi kami, kami dapat meningkatkan durasi waktu tunggu.
Untuk memverifikasi ini adalah masalah kami (dan sebenarnya bukan masalah dengan http net), saya membuat permintaan yang sama dengan curl dan mengkonfirmasi bahwa permintaan tersebut sedang dihentikan.
sumber
Di Ruby on Rails saya menggunakan kode ini, dan berfungsi dengan baik:
sumber