Ruby 将http://添加到URL仍然会被解释为不完整的URL
我编写了一个脚本,可以捕获任何http或https网站的标题,我想添加一个功能,如果我没有指定自己,可以将协议添加到URL的开头。出于某种原因,它仍然将完成的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
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
或无方案的情况