人们谈论URL,URI和URN就好像它们是不同的东西,但它们看起来与肉眼相同.
它们之间有什么区别?
URI,URL和URN之间有什么区别?我读过很多网站(甚至维基百科),但我不明白.
URI:http://www.foo.com/bar.html
URL:http://www.foo.com/bar.html
URN:bar.html
它是否正确?
我有点明白,URN用于为资源提供唯一且与位置无关的名称.然而,我没有看到它们的用处以及它们是如何工作的:
a)为了使URN真正独一无二,必须有一些中央权威(类似于域名权威),我们可以在那里注册URN,并确保它们是唯一的.既然没有这样的权力,我们怎样才能确保我们的URN是独一无二的呢?如果我们做不到.那么拥有它们有什么意义呢?
b)另外,我不理解URN格式为urn:NID:NSS的原因.是什么让这种格式比例如urn更有效/更合理:NID:NID1:NSS?
c)最后,URN如何帮助我们在互联网上找到资源?
编辑:
我不确定你是什么意思.NID是命名空间标识符,NSS是命名空间特定字符串您是否提议使用子命名空间系统?
我只想弄清楚为什么URN使用的格式对其他格式"极好",例如urn:NID:NID1:NSS
我想要有JAXB注释的类,这些类将被编组/解组到不同的XML命名空间.
我需要的是:
<someRootElement xmlns="urn:my:ns1"
xmlns:a="urn:my:ns2" xmlns:b="urn:my:ns3">
<someElement/>
<a:someElement/>
<b:someElement/>
</someRootElement>
Run Code Online (Sandbox Code Playgroud)
怎么做到呢?
可以以编程方式完成吗?(而不需要JAXB的.xjb绑定文件?)
根据维基百科,
urn:<NID>:<NSS>前导 urn: 序列不区分大小写。
<NID>是命名空间标识符,它确定<NSS>命名空间特定字符串的语法解释。RFC 1737 中描述了统一资源名称的功能要求。[5]
来源: http: //en.wikipedia.org/wiki/Uniform_resource_name
然后它继续说实验 NID 是有前缀的,X-但接着又说:
RFC 6648 不赞成对新 ID 名称使用“X-”表示法,但不建议替换现有的“X-”名称,并且不会覆盖需要使用“X-”的现有规范。[7]
那么现在怎么办?
如果我想为私有系统中的某些标识符创建一个 URN,我该如何正确命名它们?
我的直觉告诉我,该x-前缀不会获得任何好处,因为两个开发人员可以轻松地开始使用urn:x-foo,并且与他们刚刚选择的情况没有任何不同urn:foo,除了可能很明显它不是官方的已向 IANA 注册。
因此,我们应该尝试创造一些独特的东西,并尽最大努力检查它是否真实。正确的?
MIME 类型是否存在官方 URN?
urn:mimetype:text/plainMozilla Firefox 和其他应用程序使用“ ”或“ ”等符号urn:mimetype:handler:text/plain。这种方法有两个问题:
mimetype根据 IANA 官方注册表 ( http://www.iana.org/assignments/urn-namespaces/ ) ,不存在“ ”命名空间。因此,只有“ urn:x-mimetype”才是有效的命名空间(根据 RFC 3406 第 4.1 节)。
根据 RFC 2141 第 2.2 节,斜杠“ /”不能在 URN 中使用。但它可以被编码为“ %2F”。
考虑到所有因素,除了“”之外,是否还有另一种方法可以将 MIME 类型“ text/plain”表示为 URN urn:x-mimetype:text%2Fplain?
[更新:想一想,URI 也可以。但我也找不到 MIME 类型的 URI。]
谢谢
我正在寻找或者建立一个URN(统一资源名称)解析器,它将返回给定URN的0或更多URI.
例如:urn:fooid:6e8bc430-9c3a-11d9-9669-0800200c9a66:foo可能会解决http://www.example.com/fooservice/6e8bc430-9c3a-11d9-9669-0800200c9a66/foo.该服务将了解fooid-style URN并知道如何从GUID 查找base-URL(http://www.example.com/fooservice/)并将冒号转换为斜杠以生成完整的URI.
我搜索过"URN解析器",但那里并没有多少.然后我发现 - 由于DNS是以可扩展和分布式的方式快速解析地址,并且因为它已被用于其他应用程序(请参见此处) - 可能它可用于执行基本URL查找部分.
这是否已经完成,是否只是使用传统数据库的实用替代方案?
RFC2141提到:
词汇等价的例子
以下 URN 比较突出显示了词汇等价
定义:Run Code Online (Sandbox Code Playgroud)1- URN:foo:a123,456 2- urn:foo:a123,456 3- urn:FOO:a123,456 4- urn:foo:A123,456 5- urn:foo:a123%2C456 6- URN:FOO:a123%2c456URN 1、2 和 3 在词法上都是等效的。
随后的RFC8141保留了该等价性:
2.1. 命名空间标识符 (NID)
NID 不区分大小写(例如,“ISBN”和“isbn”是等效的)。
我可以在 .NET 框架中轻松找到的最接近的 URN 表示形式是URI 类。然而,它似乎并没有完全尊重 RFC 的等效定义:
[TestMethod]
public void TestEquivalentUrnsAreBroken()
{
Assert.AreEqual(
new Uri("URN:foo:a123,456"),
new Uri("urn:foo:a123,456"));
Assert.AreEqual(
new Uri("urn:foo:a123,456"),
new Uri("urn:FOO:a123,456"));
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码示例中,第一个断言按预期工作,而第二个断言失败。
是否有任何合理的方法可以让 URI 类遵守等效定义?我应该使用其他课程吗?
请注意,我已经找到了URN 类,但文档提到不应直接使用它。
我想在我的项目中使用 URN。我不太愿意将我不起眼的项目申请到 IANA 官方注册,但希望尽可能避免违反标准。这就是为什么我想知道是否有一个标准(或至少是事实上的常见做法)NID 来代替private下面的示例:
urn:private:mycompany:myproject:mycollection:myresource
Run Code Online (Sandbox Code Playgroud) 我正在使用 Azure,我注意到它为每个资源组和资源创建了一个如下所示的 ID。
对于资源组
/subscriptions/<Subscriptionid>/resourceGroups/<resourcegroupname>
对于资源,它看起来像这样
/subscriptions/<Subscriptionid>/resourceGroups/<resourcegroupname>/providers/Microsoft.Compute/disks/<disk name>
这是 azure 的唯一标识符。
这是什么类型的 URI,是 URL 还是 URN?