有人曾经多次向我解释过,所有URL都是URI,但并非所有URI都是URL。能否给出一个例子,说明某个东西是URI但不是URL?
有人曾经多次向我解释过,所有URL都是URI,但并非所有URI都是URL。能否给出一个例子,说明某个东西是URI但不是URL?
以下示例来源于这里(该网站还有差异的描述):
URL http://www.pierobon.org/iis/review1.htm
URN www.pierobon.org/iis/review1.htm#one
URI http://www.pierobon.org/iis/review1.htm.html#one
www.pierobon.org/iis/review1.htm#one
不是一个URN,因为它不以urn:
开头,并且它并不是为了以持久的方式命名资源,即使服务器上的文件结构发生变化。 - undefined统一资源名称(URN)是一个URI,它在特定的命名空间中通过名称标识资源。 URN可用于谈论资源,而不涉及其位置或如何访问它。例如,URN urn:isbn:0-395-36341-1就是一个URI。
来源:维基百科:http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
XML模式通常与URI标识符相关联,尽管它们可能格式相似,但不能保证其中有任何内容,因为它不是URL。
如果您必须验证XML文件,则必须能够识别正确的XML模式。在成功验证可以产生任何有用的结果之前,必须在内容和模式作者之间共享一种识别手段。URI可以很好地满足这个需求,与其他任何东西一样。请记住,为了使用XML文件,并不一定需要模式。因此,它不需要是通用可定位或可用的,只需要可识别即可。URI的语义避免了资源必须被定位“于此”的暗示,这是一个合理的理由。这样的细节与识别任务无关。
模式发布者通常会基于自己拥有的URL来构建URI。我可以想象有许多原因可以这样做,但其中一个原因是可以避免在中间人没有的情况下出现命名冲突。当使用这种约定时,很难抵制将定义托管在URI指向的位置,如果它是URL的话。虽然这并非必要,但我认为这样做标志着一种受欢迎的努力,并且是良好信息架构的一个例子,但这个事实与URI填充的需求无关。
为了测试Java中的URI ←→ URL转换,我使用以下示例来测试单元测试中的异常失败:
"_ "
— 非有效的URI
字符串"data://valid-uri"
— 有效的URI
,但不是有效的、格式错误的URL
(从URI#toURL
抛出MalformedURLException
)。"valid-uri"
— 有效的URI
,但不是有效的、非绝对的URL
(从URI#toURL
抛出IllegalArgumentException
)。"http:// _"
— 有效的URL
,但不是有效的、格式错误的URI
(从URL#toURI
抛出URISyntaxException
)。这可能不是符合RFC规范的完美答案,但这些都是适用于Java的工作示例。
一个常见的例子是URN,它是格式为urn:namespace-id:resource-id
的URI。根据维基百科:
在1997年RFC 2141中定义的URN旨在作为持久的、位置无关的标识符,允许将命名空间简单地映射到单个URN命名空间中。这样一个URI的存在并不意味着已经有了被标识资源的可用性,但是这样的URI需要保持全局唯一和持久,即使该资源不存在或变得不可用。
资源引用的两种风格(URL和URN)后来被合并到URI的概念下,但它们仍然被认为是具有不同目的的(强调我的):
统一资源名称(URN)可以与人的姓名相比,而统一资源定位符(URL)可以与他们的街道地址相比。换句话说,URN标识一个项目,而URL提供了一种查找它的方法。
data:,Hello%2C%20World!
- Alireza Mirian