小天管理 发表于 6月18日 发表于 6月18日 在开发 Web 应用时,我们经常需要调用不同的服务。在配置不同服务的通信和连接时,我们经常遇到 URI 、URL 和 URN 的概念。通常,用户很难区分它们,导致混淆或错误的使用。在本文中,我们将通过实例解释它们之间的区别,帮助大家更好地理解这些概念,并在阅读技术博客、文档或与其他工程师交流时正确地解读和使用它们。 什么是 URL ? URL (统一资源定位符)提供了互联网上资源的网络地址或位置。它通常用于指定网页、文件或服务的位置。URL 提供了一种标准化的格式来访问网络上的资源。它是网络浏览、链接和互联网通信的关键组成部分。 URL 由几个部分组成,这些部分一起定义了资源的地址和用于访问它的协议。让我们解析下面的 URL 作为例子,一一解释每个部分的功能。 https://example.logto.io:8080/blogs/index.html?param1=value1¶m2=value2#introduction Scheme: 指定了用于访问资源的协议或方案,如 HTTP (超文本传输协议)、HTTPS (安全的 HTTP )、FTP (文件传输协议)或 其他。 此 URL 中的 scheme 是 https。 Host: 主机指定了托管资源的服务器的域名或 IP 地址。 此 URL 中的 host 是 example.logto.io。 Port: (可选)端口表示在主机上访问资源的特定端口号。如果没有指定端口,它默认为给定方案的标准端口。 HTTP 的默认端口是 80 ,而 HTTPS 的默认端口是 443 。 此 URL 中的 port 是 8080。 Path: (可选)路径指示服务器上资源所在的特定位置或目录,可以包括目录和文件名。 此 URL 中的 path 应为 /blogs/index.html。 Query parameters: (可选)查询参数是传递给资源的额外参数,通常用于动态网络应用。它们出现在路径之后,由 ? 符号分隔。 此 URL 中的 query parameters 是 params1=value1¶m2=value2,通常以键值对的形式表示,对之间由 & 符号分隔。在实际使用场景中,通常需要编码以避免空格等字符。 Fragment identifier: (可选)它也可以被称为锚,用于定位资源中的特定位置。 此 URL 中的锚是 #introduction。 此外,使用文件服务或许多网页上的 "联系我们" 按钮都链接到 URL ,例如: ftp://documents.logto.io/files/legal/soc_ii.pdf mailto:contact@logto.io?subject=Enterprise%20quota%20request 什么是 URI ? URI 代表 "统一资源标识符"。它是一个字符串,用于标识特定的资源,如网页、文件或服务。URI 提供了一种使用标准化格式唯一标识和定位资源的方法。 URI 主要由两个组成部分组成: Scheme: 指示用于访问资源的协议或方案。 Resource identifier: 标识正在访问或引用的特定资源。资源标识符的格式取决于使用的方案。 从语法角度看,URI 大多遵循 URL 的相同格式,如 RFC 3986 中所述。 尽管这种 URI 格式与 URL 的相似,但它并不能保证访问 Web 上的所有资源。使用这种格式可以减少命名空间名称冲突。 在上面的部分中,我们介绍了 URL ,它不仅标识资源,还帮助定位资源。所以,实际上,URL 是 URI 的一个适当的子集。 什么是 URN ? URN 可能不如 URL 和 URI 常见。它代表 "统一资源名称",其范围是以持久的方式标识资源,即使这些资源不再存在。 与 URL 不同,URN 不提供任何关于如何定位资源的信息;它只是标识它,就像一个纯 URI 一样。具体来说,URN 是一种带有 "urn" 方案的 URI ,其结构如 RFC 2141 中所述: <URN>:<NID>:<NSS> URN: 通常为 urn。 命名空间标识符( NID ): 代表一个唯一的命名空间或标识符系统,定义和管理 URN 。它提供上下文,并确保标识符的唯一性。命名空间的例子包括 ISBN (国际标准书号)等。 命名空间特定字符串( NSS ): 它是一个字符串,唯一地在指定的命名空间内标识一个资源。标识符本身并不传达任何关于资源位置或访问方法的信息。 例如,一本非常著名的介绍计算机系统的书 CS: APP 的 ISBN 号表示为 URN urn:isbn:9780134092669。 URN 经常用于各种标准协议中,如 SAML 协议中的断言,对应于 URN urn:oasis:names:tc:SAML:2.0:assertion。 在软件工程中,我们也可以根据 URN 命名规则为我们自己的系统中的特定目的定义 URN 。例如,在 Logto 中,要启用 Organization ,你需要在使用 SDK 时在配置中添加 urn:logto:scope:organizations 这个 scope 。每个 Organization 也有自己的专用 URN urn:logto:organization:{orgId}。 结论 URI 、URL 和 URN 之间的关系可以用以下的文氏图来说明: URI 、URL 和 URN 都可以用来标识不同的资源,但只有 URL 可以精确地定位资源的位置。 URI 和 URL 可以支持各种方案,如 HTTP 、HTTPS 、FTP ,但 URN 可以被认为只支持 urn 方案。 所有的 URL 或 URN 都是 URI ,但并非所有的 URI 都是 URL 或 URN 。 如果有任何想法,欢迎大家讨论。更多文章请见我们的 博客。
已推荐帖子