2011-03-09 48 views
108

我正在使用ruby-1.8.7-p302/Rails 2.3.11。我正在嘗試使用fql(facebook api)獲取鏈接的統計信息。這裏是我的代碼:EOFError:文件結尾達到Net :: HTTP問題

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 

和這裏的錯誤:

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 

這似乎只發生在Facebook的API的情況下。另外,我看到它在某些帖子中提出這可能是Net :: HTTP中的一個錯誤。

+2

你找到這個解決方案?我在SFDC API中遇到類似的問題。 – Nilesh 2011-04-11 06:55:54

回答

193

如果URL使用HTTPS,而不是http,你需要添加下面一行:

parsed_url = URI.parse(url) 
http = Net::HTTP.new(parsed_url.host, parsed_url.port) 
http.use_ssl = true 

請注意額外的http.use_ssl = true

而處理http和https的更合適的代碼將類似於下面的代碼。

url = URI.parse(domain) 
req = Net::HTTP::Post.new(url.request_uri) 
req.set_form_data({'name'=>'Sur Max', 'email'=>'[email protected]'}) 
http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = (url.scheme == "https") 
response = http.request(req) 

查看更多的在我的博客:EOFError: end of file reached issue when post a form with Net::HTTP

+13

錯誤可能比這更明確! – 2014-03-21 10:38:41

+0

謝謝,這幫助我理解了'http'和'req'之間的區別。 – guptron 2014-08-13 18:40:46

+2

博客文章鏈接已損壞,請嘗試以下操作:https://web.archive.org/web/20150429191916/http://expressica.com/2012/02/10/eoferror-end-of-file-reached-問題 - 何時發佈表格 - 使用nethttp – 2016-11-14 08:01:42

0

在鐵軌我用這個代碼,它完美的作品

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'] 

希望幫助你:)

5

我對非SSL服務的請求有類似的問題。

該博客建議隱約嘗試URI編碼傳遞給「得到」的網址:http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

我參加了一個射擊在它的基礎上,無奈之下,在我的極限測試,這似乎有固定它我。我的新代碼是:

@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) 

請注意,我使用@ http.start,因爲我想維護多個請求上的HTTP會話。除此之外,你可能想嘗試最相關的部分是:URI.encode(URL)內得到調用

+1

我只是想提供一些額外的反饋意見,因爲它似乎仍然有用。我一直在生產服務器上運行這個編碼的URI 4個月,我可以確認它已經解決了這個問題。 – Phil 2012-07-27 21:21:05

3

我有同樣的問題,紅寶石1.8.7-P357,試過的東西負荷徒勞...

我終於意識到,它只發生在多個調用使用相同的XMLRPC ::客戶端實例!

所以現在我在每次調用時重新實例化我的客戶端,它只是工作:

0

做了一些研究之後,這發生在Ruby的XMLRPC::Client庫中 - 它使用NET::HTTP。客戶端使用NET::HTTP中的start()方法,該方法將連接保持爲未來請求打開狀態。

這恰好發生在最後一次請求後的30秒 - 所以我的假設是,它打的服務器正在關閉請求。我不確定NET::HTTP的默認值是如何保持請求打開 - 但我即將用60秒進行測試,看看是否能解決問題。

3

我發現我週期性地遇到Net :: HTTP和Net :: FTP這樣的問題,而當我這樣做時,使用timeout()來調用這個調用會使所有這些問題都消失。那麼,這會偶爾掛3分鐘左右,然後引發的EOFError:

res = Net::HTTP.post_form(uri, args) 

這總是修復它爲我:

res = timeout(120) { Net::HTTP.post_form(uri, args) } 
相關問題