URL 是咱們天天暢遊在互聯網世界中最最多見的東西了,對於普通用戶來講,URL 就是一個字符串,好比 http://www.justdojava.com ,可是對於咱們開發者而言,除了 URL,還有一個東西叫作 URI,不少人常常搞不清楚這兩個概念,本文咱們就從這個話題開始。html
從 URN 開始java
在介紹這兩個東西以前,咱們還得先說說另一個東西,叫作URN,URN的全程爲Uniform Resource 譯做統一資源名稱,URN、URL與URI的關係相似於下圖:web
由上圖能夠看到,URN 和 URL 其實是 URI 範疇以內的概念。URN 表示給每個互聯網資源取一個名字,可是互聯網資源千千萬萬,給每個資源取一個不重複的名字顯然不太現實,所以,並非全部的互聯網資源都有 URN ,URN 就相似於一我的的身份證號碼,是惟一的,可是經過這個身份證號碼找不到這我的,要找到這我的咱們得經過相似於下面這種地址 「中國/廣東省/廣州市/天河區/馬場路/南國花園/8棟/1203室」 ,這種可以查找到某一個資源的字符串就是 URL ,URL 全稱叫作 Uniform Resource Locator ,譯做統一資源定位符,表示一個資源的地點。瀏覽器
URL 與 URI服務器
URI 是 Uniform Resource Identifier 的縮寫,譯做統一資源標識符,RFC2396 中對這三個單詞作了以下定義:網絡
Uniformspa
規定統一的格式可方便處理多種不一樣類型的資源,而不用根據上下文環境來識別資源指定的訪問方式。另外,加入新增的協議方案(如 http: 或 ftp:)也更容易。rest
Resourceorm
資源的定義是「可標識的任何東西」。除了文檔文件、圖像或服務(例如當天的天氣預報)等可以區別於其餘類型的,全均可做爲資源。另外,資源不只能夠是單一的,也能夠是多數的集合體。xml
Identifier
表示可標識的對象。也稱爲標識符。
因而可知,URI 就是由某個協議方案表示的資源的定位標識符,而協議方案就是訪問資源時所採用的協議類型的名稱,好比咱們採用 HTTP 協議時,協議方案就是 HTTP ,咱們採用 FTP 協議時,協議方案就是 FTP ,另外還有 file、mailto、telnet 等
按照 RFC3986 的說法,一個 URI 能夠被進一步歸類爲一個定位器(URL),一個名字(URN),或二者都是。也就是說 URI 能夠是 URL ,也能夠是 URN 或二者兼備,若是你關心資源的名稱,那就將 URI 定義成 URN 的形式,若是你關心資源的位置,那麼就將 URI 定義成 URL 的形式,URI 中包括了 URN 和 URL 。在 RFC3986 文檔中還有以下一句話:
"Future specifications and related documentation should use the general term "URI" rather than the more restrictive terms "URL" and "URN""
這句話告訴咱們將來應該使用更加通用的 URI 術語,而不是受限制頗多的 URL 和 URN 。
前面介紹了 URI ,接下來咱們再來探討下 URI 的格式(基於前文得出的結論,下面涉及到的地址我將都以 URI 來稱呼)。
URI 的格式
對於普通用戶,說 URI 他們可能有點懵,可是說 http 開頭的那個字符串確定都知道是什麼了,咱們常見的網址除了 http: 開頭以外,也有 ftp: 開頭的,也有 mailto: 開頭的,分別表明不一樣的含義,這是由於瀏覽器的功能不只僅侷限於訪問 web 服務器,也能夠用來訪問 ftp 服務器,也能夠用來瀏覽本地文件,也能夠用來發送郵件,所以瀏覽器須要有一個東西來判斷使用哪一種功能來訪問相應的數據,所以有了協議,也有了各類各樣不一樣的 URI 。以下圖是一個完整的URI:
這其中用戶名、密碼和端口號均可以省略,在瀏覽器拿到這樣一個 URI 以後,首先會對其進行解析,好比上面這個地址,瀏覽器通過解析以後,知道要去獲取 www.baidu.com 服務器上的 /folder/index.html 文件。不過,在實際應用中,有的時候 URI 並非這麼清晰,好比下面這個:
這種 URI 並無直接指定要訪問哪一個文件,像這種沒有路徑的狀況,就表明訪問根目錄下預先設置的默認文件,通常就是 /index.html,/default.html 一類的文件,在 Java 中,咱們也能夠在 web.xml 中來配置這個默認文件。
有的時候咱們還有可能遇到下面這種地址:
這個 URI 以一個 / 結尾,表示 folder 是一個目錄,咱們要訪問的是這個目錄下的文件,可是又沒有說明是這個目錄下的哪一個文件,此時依然是採用該目錄下 index.html 或者 default.html 一類的文件。
有的時候,咱們還能夠看到下面這種 URI:
即 folder 後面沒有 /,此時會先將 folder 看成一個資源去訪問(好比一個名爲 folder 的 Servlet ),若是沒有名爲 folder 的資源,那麼瀏覽器會自動在 folder 後面加上一個 / ,此時地址變爲 http://www.baidu.com/folder/ ,folder 是一個目錄,而後就會去嘗試訪問 folder 目錄下的 index.html 或者 default.html。
注意這種自動調整隻在瀏覽器中存在,若是你的項目是一個手機 App 或者你是一個 Ajax 請求,則不會有這種調整,即沒寫 / 就當作具體資源來對待,若是該資源不存在,就會報 404 ,寫了/ 就當目錄來對待。(OkHtpp3中是這樣)
有的時候咱們還可能見到下面這種URI:
這個和咱們介紹的第一種狀況很相似,只是後面多了一個 / ,這個 / 表示咱們要訪問的是根目錄,可是沒有指定根目錄下的文件,默認就是根目錄下的 index.html 或者 default.html。
OK,通過上面的介紹,小夥伴對 URI 最後面的 / 已經有了清晰的認識了吧?這個東西不能夠隨意省略,有 / 和沒有 / ,訪問結果有多是天壤之別。
參考資料:
1. 《網絡是怎樣鏈接的》