Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 尝试从url获取响应并使用Ruby解析JSON时出现文件结尾错误_Ruby On Rails_Ruby_Json_Ruby On Rails 3_Debugging - Fatal编程技术网

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吗?方法。