什么是URI
URI即統一資源標示符(Uniform Resource Identifier),URI用于標識網絡上某個特定的資源。URI的重點是在于標識資源,它其實是一個抽象定義,無論用什么方式來實現,只要可以唯一標識一個資源,都可以叫做URI。URI最典型的兩種實現方式是URL(統一資源定位符,Uniform Resource Locator)和URN(即統一資源名稱,Uniform Resource Name)。URL通過資源的地址來標識一個資源,而URN則通過資源的名稱來標識一個資源。
URI和URL的區別
在開發過程中,經常會混淆兩個名詞:URI和URL,那么URI和URL之間的 關系是什么呢?首先來看下URL的定義。
-
什么是URL
URL即統一資源定位符(Uniform Resource Locator),用于標識網絡上一個資源的地址,通過URL,我們可以在網絡上唯一定位到某個資源(一個網頁,或者是一張圖片等)。URL像是資源的門牌號,通過這個門牌號,我們可以找到特定的資源。
所以,URL其實是URI的一個子集,是URI的一種實現形式。也就是說,URL一定是URI,反過來說URI則不一定是URL,因為URI還可能是URN。
URI格式
URL的基本形式如下:
[scheme:]scheme-specific-part[#fragment]
其中:
scheme:以":"為結尾(不包含":"),表示協議名,例如http,https,ftp等。
fragment:表示片段,在URI中以"#"開頭(不包含"#")。一個網頁資源可能會分為不同的片段,例如想訪問網頁后直接到達指定位置,可以通過fragment來實現。
scheme-specific-part:協議和片段之間的部分(":"之后,"#"之前),這部分會根據scheme的不同而變化。
將scheme-specific-part
部分進一步擴展,形式如下
[scheme:][//authority][path][?query][#fragment]
其中:
authority:以"http://"開頭(不包含"http://"),表示URI的授權機構,authority=host:port
path:以"/"開頭(包含"/"),表示資源的路徑,一個資源可以有多級path,每個path之間通過"/"連接 。
query:以"?"開頭(不包含"?"),以key=value形式表示的參數集合,多個query參數之間,通過&連接。
將authority
部分進一步劃分,形式如下
[scheme:][//host:port][path][?query][#fragment]
其中:
host:表示主機名或者域名。
port:表示端口號,端口號可以省略。
在android中,URI的scheme和authority部分是必須的,其他部分是可省略的。例如以下形式在android中都是合法的。
- scheme://authority
- scheme://authoriry?key1=value1&key2=value2
- scheme://authoriry?key1=value1&key2=value2#fragment
- scheme://authoriry/path1/path2
- scheme://authoriry/path1/path2#fragment
舉個栗子,有如下URI
https://www.baidu.com:8080/path1/readme.html?user=xmh&id=1#test
通過解析可以得到各部分的值如下所示。
-
scheme:
https
。 -
scheme-specific-part:":"后面到"#"中間的所有部分,即
//www.baidu.com:8080/path1/readme.html?user=xmh&id=1
-
fragment:"#"后面的部分,即
test
-
authority:"http://"之后,path("/")之前的部分,即
www.baidu.com:8080
-
host:
www.baidu.com
-
port:
8080
-
path:authority之后,query("?")之前的部分,注意path包含開頭的"/",即
/path1/readme.html
-
query:"?"后面,fragment("#")前面的部分,即
user=xmh&id=1
其他概念
絕對URI:以scheme起始的完整URI,如https://www.baidu.com。
相對URI:沒有scheme非完整URI,如www.baidu.com。
不透明URI:scheme-specific-part部分不是以"/"起始的,如mailto: test@qq.com。
分層URI:scheme-specific-part組件是以"/"起始的,如http://www.baidu.com。