EOFError:文件结尾达到Net :: HTTP的问题
我正在使用ruby-1.8.7-p302 / Rails 2.3.11。 我正在尝试使用fql(facebook api)获取链接的统计信息。 这是我的代码:
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的情况下。 另外,我看到它在某些post中提出这可能是Net :: HTTP中的一个错误。
如果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'=>'some@email.com'}) http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") response = http.request(req)
在我的博客中查看更多内容: EOFError:当使用Net :: HTTP发布表单时,文件结尾达到了问题 。
我有一个类似的问题与一个非SSL服务的请求。
这个博客build议模糊地尝试传递给“get”的URL的URI编码: http : //www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
我在绝望的基础上对它进行了一次尝试,在我的极限testing中,这似乎已经为我解决了这个问题。 我的新代码是:
@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会话。 除此之外,您可能会喜欢尝试get调用中最相关的部分: URI.encode(url)
我有同样的问题,ruby-1.8.7-p357,尝试了一些事情的徒劳…
我终于意识到,它只发生在使用相同的XMLRPC :: Client实例的多个调用!
所以现在我在每个调用中重新实例化我的客户端,它只是工作:|
我发现我周期性地遇到了Net :: HTTP和Net :: FTP这样的问题,而当我这样做时,用timeout()来调用这个调用会使所有这些问题都消失。 所以这会偶尔挂起3分钟左右,然后引发EOFError:
res = Net::HTTP.post_form(uri, args)
这总是为我修复:
res = timeout(120) { Net::HTTP.post_form(uri, args) }
在轨道中,我使用这个代码,它完美的作品
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']
希望能帮到你:)
在做了一些研究之后,这发生在Ruby的XMLRPC::Client
库中 – 它使用了NET::HTTP
。 客户端使用NET::HTTP
的start()
方法,使连接保持打开以供将来的请求使用。
这恰好发生在最后一次请求后的30秒 – 所以我的假设是,它所触发的服务器正在closures请求。 我不确定NET::HTTP
的默认值是如何保持请求打开 – 但是我要用60秒来testing,看看是否能解决这个问题。