【问题标题】:Ruby/Rails - Bad URIRuby/Rails - 错误的 URI
【发布时间】:2012-02-01 07:57:01
【问题描述】:

不知道为什么当 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")

【问题讨论】:

    标签: ruby-on-rails ruby uri nokogiri


    【解决方案1】:

    这是因为浏览器是病态友好的,就像小狗一样,会竭尽全力呈现页面或解析 URL。应用程序不会这样做,因为您必须告诉它如何友好。

    您的网址无效,因为它嵌入了空格。将空格替换为%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"
    

    【讨论】:

    • 辛苦了,谢谢。我做了以下操作,但我确信必须有一种更简洁的方法来用 %20 替换空格:#{to.strip.gsub(" ", "%20")}
    • @Fulvio require 'cgi'; CGI::escape("'Stop!' said Fred") # =&gt; "%27Stop%21%27+said+Fred" (doc)。 (或 rails 中的 h 辅助方法)。
    • @Fulvio,我添加了显示如何处理转义字符串的代码。如果您知道只需要替换一个字符,则可以使用gsub。除此之外,您应该利用预先发明的轮子并使用功能非常齐全的URIAddressable gem。
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2014-04-17
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多