最近在写代码的时候突然在按下一个回车键后陷入了沉思:URL和URI到底是什么关系?
代码语言:go复制request := http.Request{}
uri := request.URL.RequestURI()
虽然以前知道URL和URI是两个不同的概念,但是其间的相互关系并没有去深入的了解,在查询完资料之后,我得出了结论:URL是URI的一个子集,所有的URL都是URI,但不是所有的URI都是URL。
先说两者概念
URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)在Web技术中扮演着重要的角色,但它们之间确实存在一些关键的区别。
URI:统一资源标识符
URI用于唯一标识互联网上的资源。 它不仅可以标识网页,还可以标识文件、电子邮件地址、目录、服务(如FTP服务)等任何可以通过网络访问的资源。URI由几个部分组成,包括一个方案(scheme)、授权信息(authority,可选)、路径(path)、查询字符串(query,可选)和片段标识符(fragment,可选)。例如:
mailto:someone@example.com
(一个电子邮件地址)ftp://ftp.example.com/pub/file.txt
(FTP服务器上的文件)urn:isbn:0-395-36341-6
(国际标准书号)
URL:统一资源定位符
URL是URI的一个特定子集,专门用于定位互联网上的资源。它通常指的是一个可以通过HTTP、HTTPS、FTP等协议访问的网页或文件的地址。 URL提供了足够的信息来定位资源,包括网络协议、服务器地址、资源路径等。URL的组成通常包括方案、主机名(或IP地址)、端口号(可选)、路径、查询字符串(可选)和片段标识符(可选)。例如:
http://www.example.com/index.html
https://www.example.com/search?query=hello
比如我们刚刚上面的代码,在Go语言的HTTP协议中URI是可以从URL里面拿出来的,怎么拿,看源码:
代码语言:go复制// RequestURI returns the encoded path?query or opaque?query
// string that would be used in an HTTP request for u.
func (u *URL) RequestURI() string {
result := u.Opaque
if result == "" {
result = u.EscapedPath()
if result == "" {
result = "/"
}
} else {
if strings.HasPrefix(result, "//") {
result = u.Scheme ":" result
}
}
if u.ForceQuery || u.RawQuery != "" {
result = "?" u.RawQuery
}
return result
}
概念由来
在1990年,Tim Berners-Lee的关于超文本的提案间接地引入了使用URL作为一个表示超链接目标资源的短字符串的概念。当时,人们称之为“超文本名”或“文档名”。随着万维网的HTML(超文本标记语言)、HTTP与浏览器技术的发展,区别提供资源访问和资源标记的两种字符串的必要性开始显现。
在1994年6月,IETF发布了Berners-Lee的RFC 1630,非正式地指出了URL和URN(Uniform Resource Name,统一资源名称)的存在,并进一步定义了“通用资源标识符”(URI) ——语义和语法由具体协议规定的类URL字符串的规范文法。此时,URI作为一个更广泛的概念被正式提出,以涵盖URL和URN等不同类型的资源标识符。
同年12月,RFC 1738正式定义了绝对和相对URL,改进了URL文法,并列举了当时正处于使用中的URL协议。这标志着URL作为网络资源定位符的正式确立。
综上所述,URI和URL之间存在着子集关系,其中URL是URI的一个特定子集。从历史演变的角度来看,URI作为一个更广泛的概念在URL之后被正式提出,以涵盖更多类型的资源标识符。然而,在实际应用中,由于URL已经足够满足大多数网络资源的定位需求,因此它成为了最为人们所熟知和广泛使用的资源标识符之一。
使用场景
URI(统一资源标识符)和URL(统一资源定位符)在Web技术中各自拥有广泛的应用场景。
URI的应用场景:
- 资源标识:URI的主要作用是唯一标识互联网上的资源。无论是网页、文件、图片、视频、电子邮件地址还是其他任何可以通过网络访问的资源,都可以使用URI进行标识。
- 跨平台资源访问:由于URI的通用性和标准化,它使得不同平台、不同系统之间的资源访问成为可能。例如,在Android系统中,各种资源(如图像、视频、音频等)都可以使用URI来表示,并通过相应的API进行访问和操作。
- 服务调用:在微服务架构中,URI也常用于服务之间的调用。通过定义明确的URI路径和参数,服务消费者可以轻松地找到并调用所需的服务。
- 数据交换:在数据交换场景中,URI可以作为数据的唯一标识符,帮助数据在不同系统或应用之间进行传递和共享。
URL的应用场景:
- 网页定位:URL最常见的应用场景就是网页定位。用户通过浏览器输入URL地址,即可访问到对应的网页内容。这是URL最基本也是最核心的功能。
- 资源下载:除了网页定位外,URL还可以用于资源的下载。用户可以通过点击包含URL的链接来下载文件、图片等资源。
- API调用:在Web开发中,URL也常用于API的调用。通过向特定的URL发送HTTP请求,并携带相应的参数和认证信息,可以调用服务器上的API接口,获取所需的数据或服务。
- 项目协作:在项目中,团队成员可以使用URL来共享特定的网页链接或资源。这有助于团队成员之间的协作和沟通,提高工作效率。
- 数据采集和分析:URL采集工具可以广泛应用于市场调研、网络安全、数据分析等场景。通过搜集和分析URL地址及其相关信息,可以获取有价值的数据和情报。
综上所述,URI和URL在Web技术中各自扮演着重要的角色,具有广泛的应用场景。URI更侧重于资源的唯一标识和跨平台访问,而URL则更侧重于网页定位、资源下载、API调用以及用户书签和收藏等方面。
小总结
从范围来讲,URI是一个更广泛的概念,它可以唯一标识任何类型的资源,而URL则特指那些可以通过网络协议(如HTTP)定位的资源。虽然URI和URL在组成上有很多相似之处(如都包含方案、路径等),但URL更侧重于资源的定位,因此通常包含主机名和可能的端口号。在用途方面,URI用于唯一标识资源,而URL则用于定位并访问这些资源。
因此,当你看到“URI”时,它可能指的是任何类型的资源标识符,而当你看到“URL”时,你通常可以认为它是一个具体的、可访问的网络资源地址。
扩展阅读:https://danielmiessler.com/p/difference-between-uri-url/