Ошибка конца файла при попытке получить ответ от URL и синтаксический анализ JSON с Ruby - PullRequest
1 голос
/ 21 июня 2011

Я получаю эту ошибку:

Errno::ECONNRESET in SearchController#create

Connection reset by peer

и

EOFError in SearchController#create

end of file reached

Я пытаюсь получить ответ от API Google и затем проанализировать JSON с ruby. Вот мой код:

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'

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Лично я рекомендую использовать 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 автоматически обрабатывает перенаправления и, что еще лучше, дляс этой целью обрабатывает настройку HTTP-соединения для вас.

Если вы хотите использовать 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 для открытия SSL-соединения через порт 443, где, как мне кажется, ваш код не работает.Кроме того, я ищу код состояния успеха «200», который вы, возможно, захотите проверить, а затем отреагировать, если вы получили перенаправление.

0 голосов
/ 21 июня 2011

Возможно, проблема в самом Net :: HTTP. Попробуйте использовать httparty: http://github.com/jnunemaker/httparty

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...