URL、URN和URI

地址描述

URL


统一资源定位符(Uniform Resource Locator),定位资源的位置
通过java.net.URLStreamHandler可以看出URL的基本形式

URLStreamHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected String toExternalForm(URL u) {
//...
StringBuffer result = new StringBuffer(len);
result.append(u.getProtocol());
result.append(":");
if (u.getAuthority() != null && u.getAuthority().length() > 0) {
result.append("//");
result.append(u.getAuthority());
}
if (u.getPath() != null) {
result.append(u.getPath());
}
if (u.getQuery() != null) {
result.append('?');
result.append(u.getQuery());
}
if (u.getRef() != null) {
result.append("#");
result.append(u.getRef());
}
return result.toString();
}

对应URL内的成员可以把URL的形式总结成

1
2
3
protocol://authority/file[#ref]
protocol://[userInfo@]host[:port]/path[?query][#ref]
protocol://[user:password@]host[:port]/path[?query][#ref]

URI


统一资源标志符(Uniform Resource Identifier),定义资源的高层次概念标识

1
2
3
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
[scheme:][user-info@]host[port][path][?query][#fragment]

协议也是可选的

URN


统一资源名称(Uniform Resource Name),只定义资源名称
mailto:test@java.sun.com,urn:isbn:096139210x

关系


  • URL和URN都是URI的子集
  • URL可以定位到资源,必须是包含协议的完整绝对路径,而URI可以是相对的
  • URL不会进行转义编解码,只是单纯的结构化文本,URI具备转义编解码功能
  • 可以通过URI的toURL方法和URL的toURI方法相互转换

应用


定义相对URL一定要传另一个绝对URL作为参照进行信息补全

Sample
1
2
3
URL urlA = new URL("http://foo.com");
URL urlB = new URL(urlA, "hello world");
System.out.println(urlB); // http://foo.com/hello world

URL并不能进行编解码,转成URI再获取可以实现编解码

Sample
1
2
3
4
5
6
7
URL urlA = new URL("http://foo.com/hello world");
URL urlB = new URL("http://foo.com/hello%20world");
System.out.println(urlA.equals(urlB)); // false
System.out.println(urlB.getPath()); // /hello%20world
System.out.println(urlB.toURI().getPath()); // /hello world
URI uri = new URI("http", "foo.com", "/hello world", null);
System.out.println(uri.toURL().getPath()); // /hello%20world

大小写敏感


协议,域名都是大小写不敏感的
路径,查询等其他部分认为是大小写敏感。Win系统不敏感,Unix敏感