前言:一个快递员的困惑
想象你是一位快递员,站在巨大的城市中。客户告诉你:"把包裹送到良辰那里"。你一脸茫然------哪个良辰?住在哪?这时客户补充:"海淀区幸福小区13号楼14单元520室的 程序员良辰"。瞬间,地址明确了!
在互联网世界,URL和URI就是这样的"地址系统"。让我们揭开它们的神秘面纱。
URI:互联网的"身份证"系统
URI(Uniform Resource Identifier)
,统一资源标识符,是互联网上资源的"身份证"。就像每个人都有唯一的身份证号,每个网络资源也有唯一的URI。
URI的组成部分就像是一个完整的邮寄地址:
- scheme(方案):相当于"快递公司",如http、ftp、mailto等协议
- authority:通常是域名,像"幸福小区"
- path:资源路径,好比"海淀区幸福小区13号楼14单元520室"
- query:查询参数,如同"收件人:程序员良辰"
- fragment:片段标识,类似"请放在门口快递柜"
java
URI uri = new URI("https://www.example.com:8080/path/to/resource?name=value#section");
System.out.println("Scheme: " + uri.getScheme());
System.out.println("Host: " + uri.getHost());
System.out.println("Path: " + uri.getPath());
URL:不只是"地址"
URL(Uniform Resource Locator)
,统一资源定位符,是URI的子集。如果说URI是身份证,那么URL就是身份证+GPS定位。
一个经典的URL例子:
https://www.example.com:443/path/page.html?search=java#results
这就像:
- https:乘坐加密的装甲车(而非普通的http卡车)
- www.example.com:443:去往"example大厦"的443号特殊入口
- /path/page.html:大厦内的具体房间位置
- ?search=java:进入房间后要查询的关键词
- #results:直接跳转到页面中的"结果"部分

🍚🍚🍚 小知识:
- URI 是一个更广泛的概念 ,用于唯一标识任何资源(如网页、文件、书籍等),无论其是否存在或如何访问。它包括两类子集:
- URL:通过协议、主机名、路径等具体定位资源(如 https://example.com/page)。
- URN:仅通过名称标识资源(如 urn:isbn:0451450523),不依赖位置。
- URL 是 URI 的一种具体形式,必须包含访问资源的机制(如 HTTP、FTP 等协议),因此所有 URL 都是 URI,但 URI 不一定是 URL(例如 URN
类比理解(URI与URL)
-
图书馆系统:
- URI:图书的ISBN号(唯一标识)
- URL:图书馆+书架号+层数(具体位置)
-
外卖订单:
- URI:订单编号
- URL:餐厅地址+取餐柜台号
java
// URI就像类的全限定名
com.example.project.ClassName
// URL则是这个类在JVM中的实际位置
jar:file:/path/to/project.jar!/com/example/project/ClassName.class
深度探索:从URI到互联网架构
- URI 与 RESTful API:
REST架构的核心就是"资源"和"URI"。每个资源都有唯一URI,通过HTTP方法操作:

- URI编码的奥秘:
- 为什么URL中不能有空格?因为要遵循URI规范。空格会被编码为%20:
- 但是在Java中,URLEncoder.encode方法默认遵循HTML4标准,会将空格编码为+号而非%20
java
public static void main(String[] args) throws UnsupportedEncodingException {
String encoded = URLEncoder.encode("程序员 良辰", "UTF-8");
System.out.println(encoded);
}
// 结果为:%E7%A8%8B%E5%BA%8F%E5%91%98+%E8%89%AF%E8%BE%B0
- URI与安全:
- http:// vs https://:后者是加密通道
- 敏感信息不应放在URL中(会被浏览器历史记录)
- 现代Web中的URI设计
- 语义化URI:/products/1314 比 /page.php?id=1314 更友好
- 可读性:/blog/2025/url-vs-uri 比 /p=1314/uvu 更直观
Java中的应用
- Java.net包中的神器:
java
URL url = new URL("https://example.com");
try (InputStream in = url.openStream()) {
// 读取网络资源
}
- Spring框架中的URI处理:
java
UriComponentsBuilder.fromUriString("https://example.com")
.path("/api")
.queryParam("name", "value")
.build()
.toUri();
- JAX-RS中的URI模板:
java
@Path("/users/{userId}")
public class UserResource {
@GET
public String getUser(@PathParam("userId") String id) {
// ...
}
}
专业术语
-
URI:遵循RFC 3986标准的统一资源标识符,采用
<scheme>:[//<authority>]<path>[?<query>][#<fragment>]结构
-
URL:作为URI的子集,不仅标识资源还提供定位机制,包含协议、主机、端口等网络定位信息
-
URN:统一资源名称,属于URI但不提供定位功能(如urn:isbn:0451450523)
-
IRI:国际化资源标识符,支持Unicode的URI扩展
在Java生态中 ,java.net.URI
遵循URI规范,而java.net.URL
类除了标识还包含资源访问能力,但因其可变性等问题,现代Java开发更推荐使用URI结合其他HTTP客户端。
互联网的命名哲学
-
URI/URL的设计体现了计算机科学中的抽象之美------用简单的字符串表达复杂的资源关系和网络拓扑。就像哲学家给万物命名,程序员用URI为数字世界的一切赋予身份和地址。下次当你在浏览器中输入URL时,不妨想想:这不仅是地址,更是整个互联网架构的缩影。
-
正如计算机科学家
Tim Berners-Lee
所说:"URI是网络中最基础、最强大的想法之一------简单到可以写在餐巾纸上,却强大到能够定位整个互联网。"