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

时间:2010-02-18 20:21:56

标签: ruby http

我正在尝试使用Ruby通过HTTP加载网页并检查其状态代码是什么。我的代码如下所示:

  require "net/http"
  @r = Net::HTTP.get_response(URI.parse(myURL))
  return @r.code

但是,对于某些网址(主要是那些指向网络计数器之类的奇怪内容而无法给出正确答案的网址),我收到了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

我很遗憾导致这个异常的原因。我希望URI::InvalidURIError,但不是这个。

2 个答案:

答案 0 :(得分:30)

给定一个公认的方案(例如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

因此,您正在解析的其中一个URI有一个奇怪的方案 - 即使它是一个有效的URI - 这就是全部。

答案 1 :(得分:0)

首先,至于为什么它是#,我的猜测是这个错误出现在浏览器中,因此被认为是HTML。尝试查看来源并查看它是否不是#<ObjectWhatever>

至于错误,这听起来是正确的。它只是意味着您使用的URI对象没有request_uri方法。也许您打算使用path