我有这个代码的问题:
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?)
有什么想法吗?如何解决这个问题?
感谢
附言:像URI.parse(URI.encode([url]))这样的操作在这里没有任何效果。
URI不喜欢该URL中的双引号或大括号。您可以手动修复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:统一资源定位器(URL):
因此,只有字母数字、特殊字符"
$-_.+!*'(),
"和可以使用用于保留目的的保留字符在URL中未编码。
所以我想说,reegle.info应该是URL编码的东西比它们本身更多。OTOH,Ruby的URI类可以稍微宽容一点(例如,Perl的URI类将接受该URI作为输入,但它在输出时将双引号和大括号转换为它们的百分比编码形式)。