URI是統一資源標識符(Uniform Resource Identifier),URL是統一資源定位符(Uniform Resource Locator)。
具體如何標記和區分服務器上的資源用的其實就是URI,因為其經常出現在瀏覽器的地址欄里,所以也俗稱“網址”。但實際上URI和URL并不是一個東西,只不過HTTP的世界里通常網址都是URL,所以二者有時候被混淆了。
URI格式
下面的這張圖顯示了 URI 最常用的形式,由 scheme、host:port、path 和 query 四個部分組成,但有的部分可以視情況省略。
URI的基本組成
scheme
就是協議名,一般是http、https、ftp等,瀏覽器或者應用程序看到scheme后會調用下游相應API,沒有scheme后面的東西就沒法處理。
在 scheme 之后,必須是三個特定的字符“😕/”,它把 scheme 和后面的部分分離開。
authority
表示資源所在主機名,通常形式是host:port
主機名可以是 IP 地址或者域名的形式,必須要有,否則瀏覽器就會找不到服務器。但端口號有時可以省略,瀏覽器等客戶端會依據 scheme 使用默認的端口號,例如 HTTP 的默認端口號是 80,HTTPS 的默認端口號是 443。
有了協議名和主機地址、端口號,再加上后面標記資源所在位置的path,瀏覽器就可以連接服務器訪問資源了。path 采用了類似文件系統“目錄”“路徑”的表示方式,因為早期互聯網上的計算機多是 UNIX 系統,所以采用了 UNIX 的“/”風格。
URI 的 path 部分必須以“/”開始,也就是必須包含“/”,不要把“/”誤認為屬于前面 authority。
query
URI 后面還有一個“query”部分,這是對請求的服務器資源進行額外操作需要的參數,例如商品列表分頁等情況,它在 path 之后,用一個“?”開始,但不包含“?”,表示對資源附加的額外要求。
查詢參數 query 有一套自己的格式,是多個“key=value”的字符串,這些 KV 值用字符“&”連接,瀏覽器和客戶端都可以按照這個格式把長串的查詢參數解析成可理解的字典或關聯數組形式。
URI編碼
正常來說URI僅支持ASCII的,但是中文、日文或者有特殊含義的“&?”等字符咋辦呢?這里就需要轉義了。它們都需要轉為十六進制并在轉成的16進制前加上%