2010-02-18 15 views
14

Sto provando a utilizzare Ruby per caricare una pagina Web su HTTP e controllare quale sia il suo codice di stato. Il mio codice è simile al seguente:Durante il caricamento della pagina web: "metodo non definito` request_uri 'per # "

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

Tuttavia, per alcuni URL (per lo più quelli che puntano al roba strana come i contatori web che non daranno una risposta adeguata) Sto diventando un'eccezione undefined method request_uri for #. Ho rintracciato di nuovo alla linea 380 di http.rb (sto correndo Ruby 1.8), in cui si 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 

Sono abbastanza perso da ciò che provoca questa eccezione. Mi aspetterei un URI::InvalidURIError, ma non questo.

+1

Questa non è una risposta, quindi la postò come commento. Ho riscontrato questo errore durante la conversione di un'app Rails 3.0 in un'app Rails 3.1, qui: session [: return_to] = request.request_uri – Docunext

risposta

26

Dato uno schema riconosciuto (ad esempio http/https), verrà creata un'istanza di una classe più specializzata. Altrimenti viene creato un URI "generico"; l'idea di un "URI di richiesta" ha senso solo per alcuni schemi URI.

Esempio:

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 

Così una delle URI che stai parsing ha uno schema di strano - anche se è un URI valido - questo è tutto.

+0

Oh, haha, quando si verifica se esiste un metodo request_uri, ero nella pagina dei documenti sbagliata. – Matchu

+0

One-liner che dovrebbe funzionare per la maggior parte dei tipi di URI: 'uri.try (: request_uri) || uri.to_s' (prova restituirà 'nil' se l'oggetto non risponde al messaggio) – gmcnaughton

0

Prima di tutto, per quanto riguarda il motivo per cui è #, suppongo che questo errore venga visualizzato nel browser ed è quindi considerato HTML. Prova a vedere la fonte e vedere se non è #<ObjectWhatever>.

Per quanto riguarda l'errore, sembra corretto. Significa semplicemente che l'oggetto URI che stai utilizzando non ha il metodo request_uri. Forse intendevi usare path?

Problemi correlati