Ruby / Rails - плохой URI - PullRequest
       8

Ruby / Rails - плохой URI

3 голосов
/ 03 января 2012

Не уверен, почему я получаю следующую ошибку, когда 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")

1 Ответ

20 голосов
/ 03 января 2012

Это потому, что браузер патологически дружелюбен, как щенок, и пойдет на все, чтобы отобразить страницу или разрешить URL.Приложение не будет этого делать, потому что вы должны сказать ему, как быть дружелюбным.

Ваш 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"
...