[英]EOFError (end of file reached) in Ruby on Rails with http.request
[英]EOFError: end of file reached issue with 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 API的情况下发生。 另外,我在一些帖子中看到它可能是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服务的请求有类似的问题。
这篇博客模糊地建议尝试URI编码传递给'get'的URL: 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会话。 除此之外,您可能想尝试最相关的部分,即: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) }
在做了一些研究之后,这发生在Ruby的XMLRPC::Client
库中 - 它使用NET::HTTP
。 客户端使用NET::HTTP
的start()
方法,该方法保持连接为将来的请求打开。
这恰好发生在最后一次请求后的30秒 - 所以我的假设是它所服务的服务器在此之后关闭请求。 我不确定NET::HTTP
的默认值是什么,以保持请求打开 - 但我要测试60秒,看看是否能解决问题。
我最近遇到了这个问题,最终发现这是由我们遇到的端点的网络超时引起的。 幸运的是,我们能够增加超时持续时间。
为了验证这是我们的问题(实际上并不是net http的问题),我用curl做了同样的请求并确认请求被终止。
在Ruby on Rails中我使用了这个代码,它完美地工作:
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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.