一、Uri結構
(1)、基本形式:
- [scheme:]scheme-specific-part[#fragment]
scheme、scheme-specific-part、fragment
(2)、進一步劃分:
如果進一步劃分的話是這樣子的
- [scheme:][//authority][path][?query][#fragment]
- 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的形式,即再次劃分後是這樣的:
- [scheme:][//host:port][path][?query][#fragment]
三、示例
經過上面的講解,想必大家的Uri的結構就有所瞭解了,下面我們就實例看看各部分的識別方式。
- [scheme:]scheme-specific-part[#fragment]
- [scheme:][//authority][path][?query][#fragment]
- [scheme:][//host:port][path][?query][#fragment]
針對下面一個Uri字符串來匹配一下各個部分:
- 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
四、代碼提取
上面我們通過實例講解了肉眼識別Uri更部分的方式,但在代碼中又要怎樣提取呢。下面就看看Uri中提取各部分的接口,依然以上面的Uri字符串爲例:
- 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
- getPort():獲取Authority中的Port字符串,即8080
- List< String> getPathSegments():上面我們的getPath()是把path部分整個獲取下來:/yourpath/fileName.htm,getPathSegments()的作用就是依次提取出Path的各個部分的字符串,以字符串數組的形式輸出。以上面的Uri爲例:
- String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic";
- Uri mUri = Uri.parse(mUriStr);
- List<String> pathSegList = mUri.getPathSegments();
- for (String pathItem:pathSegList){
- Log.d("qijian","pathSegItem:"+pathItem);
- }
- getQueryParameter(String key):在上面我們通過getQuery()獲取整個query字段:stove=10&path=32&id=4,getQueryParameter(String key)作用就是通過傳進去path中某個Key的字符串,返回他對應的值。
- String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id#harvic";
- mUri = Uri.parse(mUriStr);
- Log.d(tag,"getQueryParameter(\"stove\"):"+mUri.getQueryParameter("stove"));
- Log.d(tag,"getQueryParameter(\"id\"):"+mUri.getQueryParameter("id"));
結果如下:
可以看到,在path中,即使針對某一個KEY不對它賦值是允許的,但在利用getQueryParameter()獲取該KEY對應的值時,獲取到的是null;
五、擴展
1、 絕對URI和相對URI
絕對URI:以scheme組件起始的完整格式,如http://fsjohnhuang.cnblogs.com。表示以對標識出現的環境無依賴的方式引用資源。
相對URI:不以scheme組件起始的非完整格式,如fsjohnhuang.cnblogs.com。表示以對依賴標識出現的環境有依賴的方式引用資源。
2、不透明URI和分層URI
不透明URI:scheme-specific-part組件不是以正斜槓(/)起始的,如mailto:[email protected]。由於不透明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 謝謝
感謝harvic分享