При загрузке веб-страницы: "неопределенный метод" request_uri "для #" - PullRequest
16 голосов
/ 18 февраля 2010

Я пытаюсь использовать Ruby для загрузки веб-страницы по HTTP и проверки ее кода состояния.Мой код выглядит следующим образом:

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

Однако для некоторых URL-адресов (в основном те, которые указывают на странные вещи, такие как веб-счетчики, которые не дают правильного ответа), я получаю исключение undefined method request_uri for #.Я проследил это до строки 380 http.rb (я использую 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 ]

30 голосов
/ 19 февраля 2010

Учитывая распознанную схему (например, 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 - и все.

0 голосов
/ 19 февраля 2010

Во-первых, почему #, я предполагаю, что эта ошибка появляется в браузере и поэтому считается HTML. Попробуйте просмотреть источник и посмотреть, если это не #<ObjectWhatever>.

Что касается ошибки, это звучит правильно. Это просто означает, что используемый вами объект URI не имеет метода request_uri. Может быть, вы хотели использовать path?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...