可以使用浏览器访问 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
我想检查一堆 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