一、URI
1.1 定义
在电脑术语中,统一资源标识符(Uniform Resource Identifier,即URI)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。
1.2 组成
一般格式为:[scheme:]scheme-specific-part[#fragment]
- [scheme:]组件 :协议名。
- scheme-specific-part组件 :用于标识资源,内部格式由具体的 scheme 来决定。
- [#fragment]组件 :#号作为fragment组件的起始字符,而fragment组件则用于聚焦到资源的某个部分。
1.3 绝对URI和相对URI
- 绝对URI:以scheme(后面跟着冒号)开头的URI。如:http://www.baidu.com, mailto:[email protected]
- 相对URI:不以scheme开始,不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相对URI可能含有相对路径(如,“..”表示上一层路径),还可能包含片段标志符。如一个图像的相对URI:
<IMG src="../icons/logo.gif" alt="logo">
1.4 不透明URI和分层URI
不透明URI:指scheme-specific-part不是以”/”开头的绝对的URI,不透明的URI不能做进一步的解析,不需要验证scheme-specific-part的有效性。如:mailto:[email protected]。
分层URI:指scheme-specific-part以”/”开头的绝对的URI或相对的URL。分层的URI的scheme-specific-part必须被分解为几个组成部分。分层的URI的scheme-specific-part必须符合下面的语法:
[//authority][path][?query]
[//authority]
,表示授权机构,authority组件的具体格式为[userinfo@]host[:port]
。[userinfo@]
,用户账号。
host
,主机IP或域名。
[:port]
,通信端口号,若省略则使用相应的scheme组件的默认端口号。[path]
,path组件表示根据authority组件识别资源的位置。path组件有一系列的路径片段(path segment)构成,路径片段间以正斜杠(/)作为分隔符。若第一个路径片段以正斜杠(/)起始则为绝对路径,否则称为相对路径。[?query]
,query组件用于识别要传递给资源的数据,用于影响资源的响应的行为。
1.5 解析
通用URI的格式如下: scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
下图展示了两个 URI 例子及它们的组成部分。
二、java.net.URI
2.1 创建URI
通过URI.create(url)或new URI(url)获得URI
2.2 获得URI各组件
如下面一个例子:
String url = "query://jankin:[email protected]:8888/public/manuals/appliances?id=1&name=jankin#ge";
URI uri = new URI(url);
System.out.println ("url = " +uri.toString());
// url = query://jankin:123456@books.com:8888/public/manuals/appliances?id=1&name=jankin#ge
System.out.println ("Scheme = " +uri.getScheme ());
// Scheme = query
System.out.println ("Scheme-specific part = " + uri.getSchemeSpecificPart ());
// Scheme-specific part = //jankin:123456@books.com:8888/public/manuals/appliances?id=1&name=jankin
System.out.println ("Fragment = " +uri.getFragment ());
// Fragment = ge
System.out.println ("Authority = " +uri.getAuthority ());
// Authority = jankin:123456@books.com:8888
System.out.println ("User Info = " +uri.getUserInfo ());
// User Info = jankin:123456
System.out.println ("Host = " +uri.getHost ());
// Host = books.com
System.out.println ("Port = " +uri.getPort ());
// Port = 8888
System.out.println ("Path = " +uri.getPath ());
// Path = /public/manuals/appliances
System.out.println ("RawPath = " +uri.getRawPath ());
// RawPath = /public/manuals/appliances
System.out.println ("Query = " +uri.getQuery());
// Query = id=1&name=jankin
System.out.println ("RawQuery = " +uri.getRawQuery());
// RawQuery = id=1&name=jankin
System.out.println ("URI is absolute: " +uri.isAbsolute ());
// URI is absolute: true
System.out.println ("URI is opaque: " +uri.isOpaque ());
// URI is opaque: false
三、android.net.Uri
2.1 创建Uri
通过Uri.parse(url)或者new Uri.Builder().build()获得
2.2 获得URI各组件
基本上和java.net.URI差不多,但android包中封装了更多方法方便我们使用,所以一般我们用android包下面的Uri更方便,如:
String url = "query://jankin:[email protected]:8888/public/manuals/appliances?id=1&name=jankin#ge";
Uri uri = Uri.parse(url);
根据参数key查询value:
System.out.println ("Query: name = " +uri.getQueryParameter("name")); //Query: name = jankin
获取路径片段集合:
System.out.println ("PathSegments = " +uri.getPathSegments()); //PathSegments = [public, manuals, appliances]
获取参数集合:
System.out.println ("getQueryParameterNames = " +uri.getQueryParameterNames ()); //getQueryParameterNames = [id, name]
四、URI、URL和URN
URI :Uniform Resource Identifier,统一资源标识符;
URL:Uniform Resource Locator,统一资源定位符;
URN:Uniform Resource Name,统一资源名称。
其中,URL,URN是URI的子集。