Лично я рекомендую использовать 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», который вы, возможно, захотите проверить, а затем отреагировать, если вы получили перенаправление.