Ruby 将http://添加到URL仍然会被解释为不完整的URL

Ruby 将http://添加到URL仍然会被解释为不完整的URL,ruby,Ruby,我编写了一个脚本,可以捕获任何http或https网站的标题,我想添加一个功能,如果我没有指定自己,可以将协议添加到URL的开头。出于某种原因,它仍然将完成的URL读取为无效URL并抛出错误 def headers(hosts) uri = URI.parse(hosts) http = Net::HTTP.new(uri.host, uri.port) if !uri.scheme uri = "http://#{uri}" puts uri elsif uri.schem

我编写了一个脚本,可以捕获任何http或https网站的标题,我想添加一个功能,如果我没有指定自己,可以将协议添加到URL的开头。出于某种原因,它仍然将完成的URL读取为无效URL并抛出错误

def headers(hosts)
uri = URI.parse(hosts)
http = Net::HTTP.new(uri.host, uri.port)

if !uri.scheme
    uri = "http://#{uri}"
    puts uri

elsif uri.scheme == 'https'
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
else
    false
end


begin
    Timeout::timeout(8) do
        http.start do
            resp = http.head('/')

            puts "#{resp.code} #{resp.message}"
            resp.each { |k, v| puts "#{k.capitalize}: #{v}" }
            puts "\n"

            http.finish
        end
    end

rescue SocketError
    puts "\nInvalid hostname: #{uri}"

rescue Timeout::Error
    puts "\n#{uri} doesn't seem to exist. Did you type the URL correctly?"

rescue Errno::ECONNREFUSED
    puts "\nERROR: #{uri}; Connection refused!"
end

end


begin
headers(ARGV[0])

rescue Interrupt
puts "\n"
end

您应该能够在脚本的早期,在下面看到这一点;如果!scheme,我添加了putsuri。我想确保我正确地创建了URL,所以我将其添加到测试中。现在,假设我运行脚本并尝试从google.com获取标题。脚本将http://添加到它的前面,果然它将:。但不知何故,它并没有正确地解释它。尝试是可行的,但尝试google.com和添加http://on则不行。我想知道为什么。谢谢。

您有两个错误:第一,您没有将url字符串重新划分为对象。第二,如果添加了模式,则不会创建新的HTTP对象。试着这样做:

if !uri.scheme
  uri = URI.parse "http://#{uri}"
end

http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == 'https'
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
问题 因为
uri
不包含字符串,所以它包含
uri::HTTP
对象:

uri=uri.parse(“http://www.ruby-lang.org/")
p uri
# => #
当您初始化
Net::http
时,您正在
http
变量中使用此选项。您只需使用新的URI创建一个新的
Net::HTTP
对象

替代方案 我注意到对于一个简单的任务有很多代码。下面是一个使用rest客户端的替代方法:

RestClient.get("http://www.google.com/").headers
这也适用于
https
或无方案的情况