2012-01-03 66 views
3

不知道爲什麼我收到以下錯誤時,URI工作在瀏覽器就好了:的Ruby/Rails - 錯誤的URI

http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps 

這是我的代碼:

def kb(to) 

    uri = "http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=#{to.strip}&u=1&p=google-apps" 
    doc = Nokogiri::XML(open(uri)) # throws error on this line 

    return parse(doc) 
end 

我得到以下錯誤:

in `split': bad URI(is not URI?): http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps (URI::InvalidURIError)` 

我以下列方式執行方法:

kb("Tom Cruise") 
+0

向我們展示一些代碼 – 2012-01-03 08:24:29

回答

20

這是因爲瀏覽器對病態友好,就像一隻小狗,並且會竭盡全力來呈現網頁或解析網址。一個應用程序不會那樣做,因爲你必須告訴它如何友好。

您的網址無效,因爲它包含空格。與%20更換空間:

irb -f 
irb(main):001:0> require 'open-uri' 
=> true 
irb(main):002:0> open('http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=Tom%20Cruise&u=1&p=google-apps').read 
=> "<?xml version=\"1.0\" standalone=\"no\"?>\n<link><actor>Tom Cruise</actor><movie>A Few Good Men (1992)</movie><actor>Kevin Bacon</actor></link>" 

轉義字符需要進行轉義很簡單:

irb -f 
irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> URI.escape('http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps') 
=> "http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=Tom%20Cruise&u=1&p=google-apps" 
+0

工作一種享受,謝謝。我做了以下,但我敢肯定,有一個更清潔的方式,用%20替換空間:'#{to.strip.gsub(「」,「%20」)}' – fuzz 2012-01-03 08:37:12

+0

@Fulvio'require'cgi 「; CGI :: escape(「'Stop!'說Fred」)#=>「%27Stop%21%27 +說+ Fred」([doc](http://ruby-doc.org/stdlib-1.9.3 /libdoc/cgi/rdoc/CGI.html#method-c-escape))。 (或者rails中的'h'輔助方法)。 – steenslag 2012-01-03 08:45:53

+0

@Fulvio,我添加了代碼來顯示如何處理字符串轉義。如果您知道只有一個字符需要替換,則使用'gsub'即可。除此之外,您應該利用預先發明的輪子並使用[URI](http://rubydoc.info/stdlib/uri/frames)或[可尋址](http://rubydoc.info/gems/addressable) /幀)寶石,這是非常全面的。 – 2012-01-03 08:53:31