URI
URL和URN是識別
定位和命名互聯網上的資源的標准途徑
本文分析了URI
URL和URN和Java API的URI和URL類(以及與URL相關的類)
並演示了如何在程序中使用這些類
年Tim Berners
Lee發明了互聯網(World Wide Web)
WWW被認為是全球互連的實際的和抽象的資源的集合
它按需求提供信息實體
通過互聯網訪問
實際的資源的范圍從文件到人
抽象的資源包括數據庫查詢
因為要通過多樣的方式識別資源(人的名字可能相同
然而計算機文件只能通過唯一的路徑名稱組合訪問)
所以需要標准的識別WWW資源的途徑
為了滿足這種需要
Tim Berners
Lee引入了標准的識別
定位和命名的途徑
URI
URL和URN
URIURL和URN是什麼? 體系中的URI
URL和URN是彼此關聯的
URI的范疇位於體系的頂層
URL和URN的范疇位於體系的底層
這種排列顯示URL和URN都是URI的子范疇
如圖
所示
圖
URI
URL和URN之間的層次關系
URL和URN是URI的子范疇
URI表示的是統一的資源標識
它是以某種統一的(標准化的)方式標識資源的簡單字符串
典型情況下
這種字符串以scheme(命名URI的名字空間的標識符
一組相關的名稱)開頭
語法如下
[scheme:] scheme
specific
part
URI以scheme和冒號開頭
Scheme用大寫/小寫字母開頭
後面為空或者跟著更多的大寫/小寫字母
數字
加號
減號和點號
冒號把scheme與scheme
specific
part分開了
並且scheme
specific
part的語法和語義(意思)由URI的名字空間決定
其中一個例子是
其中http是scheme
//是 scheme
specific
part
並且它的scheme與scheme
specific
part被冒號分開了
我們可以把URI按照絕對的或相對的分類
絕對的URI指以scheme(後面跟著冒號)開頭的URI
前面提到的就是絕對的URI的一個例子
其它的例子還有mailto:
news:comp
lang
java
help和xyz://whatever
你可以把絕對的URI看作是以某種方式引用某種資源
而這種方式對標識符出現的環境沒有依賴
如果使用文件系統作類比
絕對的URI類似於從根目錄開始的某個文件的路徑
與絕對的URI不同的
相對的URI不是以scheme(後面跟著冒號)開始的URI
它的一個例子是articles/l
你可以把相對的URI看作是以某種方式引用某種資源
而這種方式依賴於標識符出現的環境
如果用文件系統作類比
相對的URI類似於從當前目錄開始的文件路徑
URI可以進一步分為不透明的和分層的兩類
不透明的URI指scheme
specific
part不是以正斜槓(/)開頭的絕對的URI
其例子有news:comp
lang
java和前面的mailto:
不透明的URI並不是用於分解的(超出了識別scheme的范疇)
因為不需要驗證scheme
specific
part的有效性
與它不同的是
分層的URI可以是以正斜槓開頭的絕對的URI或相對的URL
與不透明的URI不同
分層的URI的scheme
specific
part必須被分解為幾個組成部分
這些組成部分是什麼?分層的URI標識組件的普通子集的scheme
specific
part符合下面的語法
[//authority] [path] [?query] [#fragment]
可選的authority組件標識了該URI名字空間的命名機構
如果有這一部分
它就是以一對正斜槓開始的
它可以是基於服務器或基於注冊的
並且它以後面的正斜槓
問號或沒有其它符號結束
基於注冊的授權機構組件有特定大綱的語法(本文沒有討論
因為很少使用它)
而基於服務器的授權機構組件的語法如下
[userinfo@] host [:port]
按照這種語法
基於服務器的授權機構組件可以隨意的以用戶信息(例如用戶名)開始
後面跟著一個@符號
緊接著是主機的名稱
以及冒號和端口號
例如:
就是一個基於服務器的授權機構組件
其中jeff包含了用戶信息
包含了主機
包含了端口
可選的path組件根據授權機構組件(如果提供了)或大綱(如果沒有授權機構組件)識別資源的定位(或位置)
路徑(path)可以分成一系列的路徑片斷(path segment)
每個路徑片斷使用正斜槓與其它的路徑片斷隔開
如果路徑的第一個路徑片斷以一個正斜槓開始
該路徑就被認為是絕對的
否則路徑就被認為是相對的
例如
/a/b/c由三個路徑片斷
a
b和c組成了一個路徑
此外
這個路徑是絕對的
因為第一個路徑片斷(a)的前綴是正斜槓
可選的query組件識別要傳遞給某種資源的數據
這種資源使用該數據獲取或生成其它的傳遞回調用者的數據
例如
x=y就是一個查詢(query)
在這個查詢中
x=y是傳遞給某種資源的數據
x是某種實體的名稱
y是該實體的值
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26272.html