可以使用浏览器访问 URL 但不能使用工作代码

Can access URL with browser but not with working code

我想检查一堆 URL 是否正常工作。所以,我写了一些代码(如下所示)来做到这一点。它适用于像 google.com 这样的网站。当我将它应用到我的场景时,它失败了。

我正在登录虚拟机。从这个 VM,我可以在浏览器中打开所需的 URL。当我尝试检查是否可以使用代码连接到 URL 时,它失败了。我的代码从文件中获取的 URL 是正确的并且可以在浏览器上运行。因此,排除了 URL 中的错误。

我的服务器 URL 如下所示 -

ab-web-internal-test-005.myweb.com

如何调试此问题并使我的代码能够连接到 URL?

这是例外情况:

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

比较浏览器和 HTTP 代理并不是特别有用。浏览器确实使用了类似的底层技术,但它有很多其他代码试图像小狗一样具有弹性和友好。除非您知道浏览器在尝试向用户展示有用的内容时还做了什么,否则很难调试 URL 和 HTTP。您最好在 IRB 中使用 OpenURI 或提供控制台的其他 gem 之一,或者在命令行使用 cURL,因为那样您可以更好地控制行为。

您的代码未处理重定向。您使用与成功相同的消息处理重定向响应,这是不正确的,因为它们不是同一件事,但您无法分辨哪个是哪个。

Net::HTTP 是一个用于创建 HTTP 服务的低级库,但是,因为它是低级的,所以您必须告诉它如何做所有事情。如果您正在创建自己的新服务,那很好,但是对于检索页面,您可以更轻松地使用 OpenURI 或其他 gem 之一来处理您的访问,这些访问确实实现了重定向,例如 Curb, Typhoeus, HTTPClient, RestClient, HTTParty,等等

如果您打算使用 Net::HTTP,那么您需要实施完整的重定向处理代码,该代码在 the documentation.

中给出

根据铁皮人的解释,将尝试使用typhoeus概念来回答:

require 'typhoeus'

File.readlines('C:/mycode/servers.txt').each do |server_uri|
  puts Typhoeus::Request.new(server_uri).run.code
end