URI結構解析

什么是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中都是合法的。

舉個栗子,有如下URI
https://www.baidu.com:8080/path1/readme.html?user=xmh&id=1#test
通過解析可以得到各部分的值如下所示。

  • schemehttps
  • scheme-specific-part:":"后面到"#"中間的所有部分,即//www.baidu.com:8080/path1/readme.html?user=xmh&id=1
  • fragment:"#"后面的部分,即test
  • authority:"http://"之后,path("/")之前的部分,即www.baidu.com:8080
  • hostwww.baidu.com
  • port8080
  • 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容