java中URI,URL,URL介绍及Android中Uri解析

一、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的子集。

参考

Java魔法堂:URI、URL(含URL Protocol Handler)和URN

Java中URI,URL和URN的使用

猜你喜欢

转载自blog.csdn.net/Kelaker/article/details/80558261