RDF :: Reader> URI :: InvalidError的问题

时间:2011-06-24 09:33:25

标签: ruby rdf url-encoding redland

我对此代码有疑问:

require 'rubygems'
require 'rdf'
require 'rdf/raptor'

RDF::Reader.open("http://reegle.info/countries/IN.rdf") do |reader|
  reader.each_statement do |statement|
    puts statement.inspect
  end
end

当试图打开上面提到的url时,我被重定向到一个url,URI.parse显然不喜欢:

http://sparql.reegle.info?query=CONSTRUCT+{+%3Chttp://reegle.info/countries/IN%3E+?p+?o.+%3Chttp://reegle.info/countries/IN.rdf%3E+foaf:primaryTopic+%3Chttp://reegle.info/countries/IN%3E;+cc:license+%3Chttp://www.nationalarchives.gov.uk/doc/open-government-licence%3E;+cc:attributionName+"REEEP";+cc:attributionURL+%3Chttp://reegle.info/countries/IN%3E.+}+WHERE+{+%3Chttp://reegle.info/countries/IN%3E+?p+?o.}&format=application/rdf%2Bxml

所以我收到以下错误:

URI::InvalidURIError: bad URI(is not URI?)

任何想法,如何解决这个问题?

由于

P.S。像URI.parse(URI.encode([url]))这样的东西在这里没有任何效果。

1 个答案:

答案 0 :(得分:1)

URI不喜欢该网址中的双引号或大括号。您可以手动修复URI,如下所示:

# This auto-populating cache isn't necessary but...
replacements = Hash.new { |h,k| h[k] = URI.encode(k) }
broken_uri.gsub!(/[{}"]/) { replacements[$&] }

来自RFC 1738: Uniform Resource Locators (URL)

  

因此,只有字母数字,特殊字符“$-_.+!*'(),”,和   可以使用用于其保留目的的保留字符   在URL中未编码。

所以我要说reegle.info应该是URL编码比它们更多的东西。 OTOH,Ruby的URI类可能更宽容(例如,Perl的URI class将接受该URI作为输入,但它将双引号和大括号转换为输出上的百分比编码形式。)