我正在尝试使用Ruby通过HTTP加载网页并检查其状态代码是什么.我的代码看起来像这样:
require "net/http"
@r = Net::HTTP.get_response(URI.parse(myURL))
return @r.code
Run Code Online (Sandbox Code Playgroud)
但是,对于某些URL(大多数指向像网络计数器这样无法给出正确响应的奇怪内容)我得到一个undefined method request_uri for #例外.我已经将它追溯到http.rb的第380行(我正在运行Ruby 1.8),它说:
def HTTP.get_response(uri_or_host, path = nil, port = nil, &block)
if path
host = uri_or_host
new(host, port || HTTP.default_port).start {|http|
return http.request_get(path, &block)
}
else
uri = uri_or_host
new(uri.host, uri.port).start {|http|
return http.request_get(uri.request_uri, &block) <--- LINE 380
}
end
end
Run Code Online (Sandbox Code Playgroud)
我很遗憾导致这个异常的原因.我期待一个URI::InvalidURIError,但不是这个.
小智 31
给定一个公认的方案(例如http/https),将实例化一个更专业的类.否则,创建"通用"URI; "请求URI"的概念仅对某些URI方案有意义.
例:
irb(main):001:0> require 'uri'
=> true
irb(main):002:0> URI.parse('http://www.google.com/').class
=> URI::HTTP
irb(main):003:0> URI.parse('https://www.google.com/').class
=> URI::HTTPS
irb(main):004:0> URI.parse('foo://www.google.com/').class
=> URI::Generic
irb(main):005:0> URI.parse('http://www.google.com/').respond_to?(:request_uri)
=> true
irb(main):006:0> URI.parse('https://www.google.com/').respond_to?(:request_uri)
=> true
irb(main):007:0> URI.parse('foo://www.google.com/').respond_to?(:request_uri)
=> false
Run Code Online (Sandbox Code Playgroud)
因此,您正在解析的URI之一有一个奇怪的方案 - 即使它是一个有效的URI - 这就是全部.