在加载网页时:"未定义的方法`request_uri'为#"

Zar*_*nen 17 ruby http

我正在尝试使用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 - 这就是全部.