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

时间:2015-01-09 23:16:12

标签: ruby url

我想检查一堆网址是否有效。所以,我写了一些代码(如下所示)来做到这一点。它适用于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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果您要使用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