Uri详解之——Uri结构与代码提取

目录(?)[+]html

前言:依然没有前言……前端


相关博客:
一、《Uri详解之——Uri结构与代码提取》
二、《Uri详解之二——经过自定义Uri外部启动APP与Notification启动》
java

 

上几篇给你们讲了ContentProvider,里面有用到Uri,可能不少同窗对Uri是什么,怎么来的,这些都不是很熟悉,今天就给你们具体讲讲Uriandroid

1、URI与Uri

你们可能常常会看到在开发时,怎么有的时候是URI,有的时候是Uri,这是怎么回事?数组

名称如此相像的两个类是有什么区别和联系?
微信

  • 1.所属的包不一样。URI位置在java.net.URI,显然是Java提供的一个类。而Uri位置在android.net.Uri,是由Android提供的一个类。因此初步能够判断,Uri是URI的“扩展”以适应Android系统的须要。
  • 2.做用的不一样。URI类表明了一个URI(这个URI不是类,而是其原本的意义:通用资源标志符——Uniform Resource Identifier)实例。Uri类是一个不可改变的URI引用,包括一个URI和一些碎片,URI跟在“#”后面。创建而且转换URI引用。并且Uri类对无效的行为不敏感,对于无效的输入没有定义相应的行为,若是没有另外制定,它将返回垃圾而不是抛出一个异常。

看不懂?不要紧,知道这个就能够了:Uri是Android开发的,扩展了Java中URI的一些功能来特定的适用于Android开发,因此你们在开发时,只使用Android 提供的Uri便可;
微信开发

2、Uri结构

(1)、基本形式:

[html] view plain copy
  1. [scheme:]scheme-specific-part[#fragment]  

这里分为三部分:
scheme、scheme-specific-part、fragmentide

(2)、进一步划分:

若是进一步划分的话是这样子的函数

[html] view plain copy
  1. [scheme:][//authority][path][?query][#fragment]  

其中有下面几个规则:spa

  • path能够有多个,每一个用/链接,好比
    scheme://authority/path1/path2/path3?query#fragment
  • query参数能够带有对应的值,也能够不带,若是带对应的值用=表示,如:
    scheme://authority/path1/path2/path3?id = 1#fragment,这里有一个参数id,它的值是1
  • query参数能够有多个,每一个用&链接
    scheme://authority/path1/path2/path3?id = 1&name = mingming&old#fragment
    这里有三个参数:
    参数1:id,其值是:1
    参数2:name,其值是:mingming
    参数3:old,没有对它赋值,因此它的值是null
  • 在android中,除了scheme、authority是必需要有的,其它的几个path、query、fragment,它们每个能够选择性的要或不要,但顺序不能变,好比:
    其中"path"可不要:scheme://authority?query#fragment
    其中"path"和"query"可都不要:scheme://authority#fragment
    其中"query"和"fragment"可都不要:scheme://authority/path
    "path","query","fragment"都不要:scheme://authority
    等等……

(3)、终极划分

其中authority,又能够分为host:port的形式,即再次划分后是这样的:

[html] view plain copy
  1. [scheme:][//host:port][path][?query][#fragment]  

因此这是划分最细的形式,其中host:port用冒号分隔,冒号前的是host,冒号后的port;

3、示例

通过上面的讲解,想必你们的Uri的结构就有所了解了,下面咱们就实例看看各部分的识别方式。

[html] view plain copy
  1. [scheme:]scheme-specific-part[#fragment]  
  2. [scheme:][//authority][path][?query][#fragment]  
  3. [scheme:][//host:port][path][?query][#fragment]  

先列出这三种Uri形式,好让你们对比;
针对下面一个Uri字符串来匹配一下各个部分:

[java] view plain copy
  1. http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic  
  • scheme:匹对上面的两个Uri标准形式,很容易看出在:前的部分是scheme,因此这个Uri字符串的sheme是:http
  • scheme-specific-part:很容易看出scheme-specific-part是包含在scheme和fragment之间的部分,也就是包括第二部分的[//authority][path][?query]这几个小部分,所在这个Uri字符串的scheme-specific-part是://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4 ,注意要带上//,由于除了[scheme:]和[#fragment]部分所有都是scheme-specific-part,固然包括最前面的//;
  • fragment:这个是更容易看出的,由于在最后用#分隔的部分就是fragment,因此这个Uri的fragment是:harvic
    下面就是对scheme-specific-part进行拆分了;
    在scheme-specific-part中,最前端的部分就是authority,?后面的部分是query,中间的部分就是path
  • authority:很容易看出scheme-specific-part最新端的部分是:www.java2s.com:8080
  • query:在scheme-specific-part中,?后的部分为:stove=10&path=32&id=4
  • path:在**query:**在scheme-specific-part中,除了authority和query其他都是path的部分:/yourpath/fileName.htm
    又因为authority又一步能够划分为host:port形式,其中host:port用冒号分隔,冒号前的是host,冒号后的是port,因此:
  • host:www.java2s.com
  • port:8080

4、代码提取

上面咱们经过实例讲解了肉眼识别Uri更部分的方式,但在代码中又要怎样提取呢。下面就看看Uri中提取各部分的接口,依然以上面的Uri字符串为例:

[java] view plain copy
  1. http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic  
  • getScheme() :获取Uri中的scheme字符串部分,在这里即,http
  • getSchemeSpecificPart():获取Uri中的scheme-specific-part:部分,这里是://www.java2s.com:8080/yourpath/fileName.htm?
  • getFragment():获取Uri中的Fragment部分,即harvic
  • getAuthority():获取Uri中Authority部分,即www.java2s.com:8080
  • getPath():获取Uri中path部分,即/yourpath/fileName.htm
  • getQuery():获取Uri中的query部分,即stove=10&path=32&id=4
  • getHost():获取Authority中的Host字符串,即www.java2s.com
  • getPost():获取Authority中的Port字符串,即8080

另外还有两个经常使用的:getPathSegments()、getQueryParameter(String key)

  • List< String> getPathSegments():上面咱们的getPath()是把path部分整个获取下来:/yourpath/fileName.htm,getPathSegments()的做用就是依次提取出Path的各个部分的字符串,以字符串数组的形式输出。以上面的Uri为例:
[java] view plain copy
  1. String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic";  
  2. Uri mUri = Uri.parse(mUriStr);  
  3. List<String> pathSegList = mUri.getPathSegments();  
  4. for (String pathItem:pathSegList){  
  5.     Log.d("qijian","pathSegItem:"+pathItem);  
  6. }  

打出来的列表为:

  • getQueryParameter(String key):在上面咱们经过getQuery()获取整个query字段:stove=10&path=32&id=4,getQueryParameter(String key)做用就是经过传进去path中某个Key的字符串,返回他对应的值。
[java] view plain copy
  1. String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id#harvic";  
  2. mUri = Uri.parse(mUriStr);  
  3. Log.d(tag,"getQueryParameter(\"stove\"):"+mUri.getQueryParameter("stove"));  
  4. Log.d(tag,"getQueryParameter(\"id\"):"+mUri.getQueryParameter("id"));  

注意注意,我稍微更改了下字符串,把query中id的值去掉了!!!!!而后看看经过getQueryParameter("id")获取它的值会获得什么!
结果以下:

能够看到,在path中,即便针对某一个KEY不对它赋值是容许的,但在利用getQueryParameter()获取该KEY对应的值时,获取到的是null;

5、扩展

一、 绝对URI和相对URI

绝对URI:以scheme组件起始的完整格式,如http://fsjohnhuang.cnblogs.com。表示以对标识出现的环境无依赖的方式引用资源。
相对URI:不以scheme组件起始的非完整格式,如fsjohnhuang.cnblogs.com。表示以对依赖标识出现的环境有依赖的方式引用资源。

二、不透明URI和分层URI

不透明URI:scheme-specific-part组件不是以正斜杠(/)起始的,如mailto:fsjohnhuang@xxx.com。因为不透明URI无需进行分解操做,所以不会对scheme-specific-part组件进行有效性验证。
分层URI:scheme-specific-part组件是以正斜杠(/)起始的,如http://fsjohnhuang.com。

 

更多有关本扩展和标准化(Normalization)、解析化(Resolution)、相对化(Relativization)的知识参见:《Java魔法堂:URI、URL(含URL Protocol Handler)和URN》

 

下面源码中演示了各个提取函数的用法及结果;

若是本文有帮到你,记得关注哦

源码下载地址:http://download.csdn.net/detail/harvic880925/8539679

请你们尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/44679239 谢谢

若是你喜欢个人文章,那么你将会更喜欢个人微信公众号,将按期推送博主最新文章与收集干货分享给你们(一周一次)

相关文章
相关标签/搜索