Ruby on rails 尝试从url获取响应并使用Ruby解析JSON时出现文件结尾错误
我不断地发现这个错误:Ruby on rails 尝试从url获取响应并使用Ruby解析JSON时出现文件结尾错误,ruby-on-rails,ruby,json,ruby-on-rails-3,debugging,Ruby On Rails,Ruby,Json,Ruby On Rails 3,Debugging,我不断地发现这个错误: Errno::ECONNRESET in SearchController#create Connection reset by peer 及 我试图从Google的API获取响应,然后用ruby解析JSON。这是我的密码: require 'rubygems' require 'json' require 'net/https' def create @search = params[:search][:search] base_url = "https:
Errno::ECONNRESET in SearchController#create
Connection reset by peer
及
我试图从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\u 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'
这可能是Net::HTTP本身的问题。尝试使用httparty:可能是Net::HTTP本身有问题。尝试使用httparty:我个人建议使用,除非您需要较低级别例程的粒度或控制:
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
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”,您可能希望检查该代码,然后在收到重定向时做出反应。我个人建议使用,除非您需要较低级别例程的粒度或控制:
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
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”,您可能希望检查它,然后在收到重定向时做出反应。如果使用
http://...
URL而不是https://...
?是。。。。。。。。。。。。。如果我使用http它就可以工作如果你使用http://...
URL而不是https://...
?是。。。。。。。。。。。。。如果我使用HTTP,它就可以工作。问题不在于Net::HTTP。这是因为他没有正确设置连接。问题不在于Net::HTTP。原因是他没有正确设置连接。应该将要求的“net/http”更改为https。。http没有use_ssl=方法。它只有使用ssl吗?方法。应将所需的“net/http”更改为https。。http没有use_ssl=方法。它只有使用ssl吗?方法。