我想检查一堆网址是否有效。所以,我写了一些代码(如下所示)来做到这一点。它适用于google.com等网站。当我将它应用到我的场景时,它会失败。
我正在登录虚拟机。通过此VM,我可以在浏览器中打开所需的URL。当我尝试检查是否可以使用代码连接到URL时,它会失败。我的代码从文件中获取的URL是正确的,适用于浏览器。因此,排除了URL中的错误。
我的服务器网址看起来像这样 -
ab-web-internal-test-005.myweb.com
如何调试此问题并启用我的代码以连接到网址?
这是一个例外:
C:/mycode/>ruby LinkTester.rb
C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:878:in `initialize': No connection could be made because the target machine actively refused it. -
connect(2) (Errno::ECONNREFUSED)
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:878:in `open'
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:878:in `block in connect'
from C:/Ruby200-x64/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:877:in `connect'
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:851:in `start'
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:582:in `start'
from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:477:in `get_response'
from LinkTester.rb:9:in `connect_to_url'
from LinkTester.rb:38:in `block in <main>'
from LinkTester.rb:37:in `each'
from LinkTester.rb:37:in `<main>'
代码 -
require "net/http"
require "uri"
def connect_to_url(url)
response = nil
encoded_uri = URI.encode(url)
uri = URI.parse(encoded_uri)
response = Net::HTTP.get_response(uri)
http = Net::HTTP.new(uri.host, uri.port)
response = http.request(Net::HTTP::Get.new(uri.request_uri))
case http_response
when Net::HTTPSuccess
puts uri + "success"
when Net::HTTPRedirect
puts uri + "success"
else
puts uri + "failure"
end
end
def get_urls(file_path)
array = Array.new
file = File.open(file_path, "r")
file.each_line do |line|
array << line
end
file.close
return array
end
url_file = "C:/mycode/servers.txt"
url_array = get_urls(url_file);
url_array.each do |url|
connect_to_url(url)
end
答案 0 :(得分:2)
比较浏览器和HTTP代理并不是特别有用。浏览器确实使用类似的底层技术,但它有很多其他代码,它们试图具有弹性,并且像小狗一样友好。除非您知道浏览器在尝试向用户呈现有用的内容时还做了什么,否则调试URL和HTTP可能会很困难。您可能在IRB中使用OpenURI或提供控制台的其他宝石之一或在命令行使用cURL可能会做得更好,因为这样您就可以更好地控制行为。
您的代码未处理重定向。你使用与成功相同的消息来处理重定向响应,这不是真的,因为它们不是同一个东西,但你无法分辨哪个是哪个。
Net :: HTTP是一个用于创建HTTP服务的低级库,但是,因为它是低级别的,所以你必须告诉它如何做所有事情。如果您正在创建自己的新服务,这很好,但是对于检索页面,您可以使用OpenURI或其他一个宝石来更轻松地处理您实现重定向的访问,例如Curb,Typhoeus, HTTPClient,RestClient,HTTParty等
如果您要使用Net :: HTTP,则需要实现完整的重定向处理代码,该代码在the documentation中给出。
答案 1 :(得分:1)
根据Tin Man的解释,将尝试使用typhoeus
概念回答:
require 'typhoeus'
File.readlines('C:/mycode/servers.txt').each do |server_uri|
puts Typhoeus::Request.new(server_uri).run.code
end