2010-02-18 14 views
14

Estoy intentando usar Ruby para cargar una página web a través de HTTP y verificar cuál es su código de estado. Mi código es el siguiente:Al cargar la página web: "método indefinido` request_uri 'para # "

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

Sin embargo, para algunas direcciones URL (en su mayoría los que apuntan a cosas raras como contadores web que no den una respuesta adecuada) Estoy consiguiendo una excepción undefined method request_uri for #. He rastreado de nuevo a la línea 380 de http.rb (Estoy corriendo Rubí 1.8), donde dice:

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 

estoy bastante perdido en cuanto a qué causa esta excepción. Esperaría un URI::InvalidURIError, pero esto no.

+1

Esto no es una respuesta, así que lo publico como un comentario. Llegué a este error al convertir una aplicación de Rails 3.0 a una aplicación de Rails 3.1, aquí: session [: return_to] = request.request_uri – Docunext

Respuesta

26

Dado un esquema reconocido (por ejemplo, http/https), se creará una instancia de una clase más especializada. De lo contrario, se crea un URI "genérico"; la idea de un "URI de solicitud" solo tiene sentido para algunos esquemas de URI.

Ejemplo:

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 

Así que uno de los URI que estés análisis sintáctico tiene un esquema extraño - a pesar de que es un URI válido - eso es todo.

+0

Oh, jaja, al comprobar si existe un método request_uri, estaba en la página de documentos equivocados. – Matchu

+0

One-liner que debería funcionar para la mayoría de los tipos de URI: 'uri.try (: request_uri) || uri.to_s' (try devolverá 'nil' si el objeto no responde al mensaje) – gmcnaughton

0

En primer lugar, en cuanto a por qué es #, supongo que este error aparece en el navegador y, por lo tanto, se considera HTML. Intenta ver la fuente y ver si no es #<ObjectWhatever>.

En cuanto al error, eso suena correcto. Simplemente significa que el objeto URI que está utilizando no tiene el método request_uri. ¿Quizás quisiste usar path?

Cuestiones relacionadas