尝试从URL获取响应并使用Ruby解析JSON时出现文件结束错误

我一直收到这个错误:

Errno::ECONNRESET in SearchController#create Connection reset by peer 

 EOFError in SearchController#create end of file reached 

我正在尝试从Google的API获取响应,然后使用ruby解析JSON。 这是我的代码:

 require 'rubygems' require 'json' require 'net/https' def create @search = params[:search][:search] base_url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0" url = "#{base_url}&q=#{@search}&rsz=8&start=0" resp = Net::HTTP.get_response(URI.parse(url)) data = resp.body result = JSON.parse(data) if result.has_key? 'Error' raise "web service error" end return result end 

resp = Net::HTTP.get_response(URI.parse(url))似乎是给我错误的行。 我怎样才能解决这个问题?

这是完整跟踪的第一部分:

 /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/protocol.rb:135:in `sysread' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:62:in `timeout' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:93:in `timeout' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/protocol.rb:116:in `readuntil' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/protocol.rb:126:in `readline' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:2020:in `read_status_line' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:2009:in `read_new' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:1050:in `request' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:948:in `request_get' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:380:in `get_response' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:543:in `start' /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:379:in `get_response' app/controllers/search_controller.rb:10:in `create' 

就个人而言,我建议使用Open::URI除非您需要较低级别例程的粒度或控件:

 require 'open-uri' require 'json' def create search = params[:search][:search] base_url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0" stream = open("#{base_url}&q=#{search}&rsz=8&start=0") raise 'web service error' if (stream.status.first != '200') JSON.parse(stream.read) end 

Open :: URI自动处理重定向,更好的是,为此目的,处理为您设置HTTPs连接。

如果你想使用Net :: HTTP,这将有效:

 require 'rubygems' require 'json' require 'net/http' def create(search) base_url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0" url = "#{base_url}&q=#{search}&rsz=8&start=0" uri = URI.parse(url) connection = Net::HTTP.new(uri.host, 443) connection.use_ssl = true resp = connection.request_get(uri.path + '?' + uri.query) if resp.code != '200' raise "web service error" end JSON.parse(resp.body) end puts create('ruby') 

不同之处在于我告诉Net :: HTTP使用端口443打开SSL连接,这是我认为您的代码失败的地方。 此外,我正在寻找您可能想要检查的成功状态代码’200’,然后如果您有重定向则做出反应。

它可能是Net :: HTTP本身的问题。 尝试使用httparty: http ://github.com/jnunemaker/httparty