關(guān)于URL
說起URL齿尽,大家第一反應(yīng)可能是這不就是一個(gè)地址嗎紫新,還能有什么門道扣甲?
URL是Uniform Resource Locator的縮寫,稱為統(tǒng)一資源定位符奏甫。URL正是使用web瀏覽器訪問web頁面時(shí)需要輸入的網(wǎng)頁地址。URL是一種強(qiáng)有力的工具凌受。但URL并不完美阵子。它表示的是實(shí)際的地址,而不是準(zhǔn)確的名字胜蛉。這種方案的缺點(diǎn)在于如果資源被移走了挠进,URL也就不再有效了。那么它就無法對對象進(jìn)行定位了 誊册。
URL的構(gòu)成
一個(gè)標(biāo)準(zhǔn)的URL語法組成是下面這樣的:
scheme://login:password@address:port/path_to_resource?query_string#fragment
簡化下上面的組成领突,就可以把URL分成下面四部分:
傳輸協(xié)議 + 域名或IP地址 + [端口(端口為80時(shí)可省略)] + 資源路徑 + 查詢字符串
如果要指定訪問端口時(shí)需要用“:”來隔開,例如(http://www.baidu.com:80/index.php)
1案怯、傳輸協(xié)議
協(xié)議名稱是由一串不區(qū)分大小寫的字母組成君旦,以 : 作為結(jié)束符。協(xié)議所表示的是獲取該資源需要使用的協(xié)議嘲碱。如HTTP金砍、HTTPS等。常見的協(xié)議有:
http
http是一種超文本傳輸協(xié)議悍汛,除了沒有用戶名和密碼之外捞魁,與通用的URL格式相符。如果省略了端口离咐,就默認(rèn)為80谱俭。
基本格式:http://<host>:<port>/<path>?<query>#<frag>
示例:http://www.baidu.com/index.html或http://www.baidu.com:80/index.html
https
https與http是一對,唯一的區(qū)別在于https在http的基礎(chǔ)上加上了SSL宵蛀, SSL為http連接提供了端到端的加密機(jī)制昆著。其語法與http的語法相同,默認(rèn)端口為443术陶。
基本格式:https://<host>:<port>/<path>?<query>#<frag>
示例:https://kyfw.12306.cn/otn/leftTicket/init
mailto
mailto URL指向的是E-mail地址凑懂,由于E-mail的行為與其他方案都有所不同(它并不指向任何可以直接訪問的對象),所以mailto URL的格式與標(biāo)準(zhǔn)URL的格式也有所不同梧宫。
ftp
ftp協(xié)議是文件傳輸協(xié)議接谨,通過該協(xié)議的URL可以從FTP服務(wù)器上下載或向其上傳文件,并獲取FTP服務(wù)器上的目錄結(jié)構(gòu)內(nèi)容的列表塘匣。
基本格式:ftp://<user>:<password>@<host>:<port>/<path>;<params>
示例:ftp://root:test2017@tsinghua.edu:21/pub/gnu/
鑒于主題和篇幅關(guān)系脓豪,其他的協(xié)議就不一一介紹了,有興趣可以額外搜索了解忌卤。
2扫夜、主機(jī)和端口
要想在互聯(lián)網(wǎng)上找到資源,應(yīng)用程序要知道是哪臺(tái)機(jī)器裝載了資源,以及在那臺(tái)機(jī)器的什么地方可以找到能對目標(biāo)資源進(jìn)行訪問的服務(wù)器笤闯,URL的主機(jī)和端口組件提供了這兩組信息堕阔。
主機(jī)標(biāo)識了互聯(lián)網(wǎng)上能夠訪問資源的宿主機(jī)器】盼叮可以用上述域名(www.baidu.com)或者IP地址(14.215.177.38)來表示主機(jī)名超陆。
端口組件標(biāo)識了服務(wù)器正在監(jiān)聽的網(wǎng)絡(luò)端口,對下層使用了TCP協(xié)議的HTTP來說脱衙,默認(rèn)端口號就是80侥猬。
3例驹、資源路徑
URL的資源路徑說明了需要訪問的資源位于服務(wù)器的什么地方捐韩,路徑通常就像一個(gè)分級的文件系統(tǒng)路徑。
示例:https://github.com/AlanYangs/Log4Reports/blob/master/pom.xml
這個(gè)URL中的路徑為/AlanYangs/Log4Reports/blob/master/pom.xml鹃锈,很像UNIX文件系統(tǒng)中的文件系統(tǒng)路徑荤胁。路徑是服務(wù)器定位資源時(shí)所需的信息,可以用字符“/”將HTTP URL的路徑組件劃分成一些路徑段(path segment)屎债。
4仅政、查詢字符串
很多資源,比如數(shù)據(jù)庫服務(wù)盆驹,都是可以通過査詢來縮小所請求資源類型范圍的圆丹。假設(shè)數(shù)據(jù)庫中維護(hù)著一個(gè)未售貨物的清單,并可以對淸單進(jìn)行査詢躯喇,以判斷產(chǎn)品是否有貨辫封,那就可以用下列URL來査詢Web數(shù)據(jù)庫網(wǎng)關(guān),看看id為12731廉丽、顏色為blue倦微、尺寸為large的條目是否有貨:
http://www.test.com/query?id=12731&color=blue&size=large
分析下上面的URL,發(fā)現(xiàn)問號(?)右邊的內(nèi)容是前面沒有出現(xiàn)的正压,這部分可以稱為查詢(query)組件欣福,通常是以鍵值對的形式出現(xiàn),多個(gè)鍵值對之間用&連接焦履。此外拓劝,對于查詢字符串除了有些不合規(guī)則的字符(比如空格等)還需要轉(zhuǎn)碼處理。
HTTP的請求的方式
這一部分從內(nèi)容上看貌似應(yīng)該放在上一篇《關(guān)于HTTP》中說明的嘉裤,放在URL中來說明是為了更好的理解GET和POST方式的區(qū)別郑临。HTTP的請求的方式有多種,打開一個(gè)HTTP接口工具(PostMan)价脾,可以查看下請求的類型:
postman
請求類型有這么多牧抵,我們通常只需要關(guān)注GET和POST就好,下面具體介紹下GET和POST方法的URL樣式及對比。
1犀变、URL樣式
GET - 通常是從指定的服務(wù)器中獲取數(shù)據(jù)妹孙,查詢字符串(鍵值對)被附加在URL地址后面一起發(fā)送到服務(wù)器,如下面這樣的:http://localhost:8090/api/query?id=3获枝,在postman中的請求示例如下:
POST - 通常是提交數(shù)據(jù)給指定的服務(wù)器處理蠢正,當(dāng)然也可以從服務(wù)器獲取數(shù)據(jù)。使用POST方法時(shí)省店,查詢字符串或發(fā)送的數(shù)據(jù)在POST信息中單獨(dú)存在嚣崭,和請求URL一起發(fā)送到服務(wù)器,而不是像GET方法一樣直接放在URL中懦傍。在postman中的請求示例如下:
2雹舀、GET和POST的區(qū)別
從上面的例子我們可以看到,GET請求消息體(body)為空粗俱,POST請求帶有消息體(請區(qū)分請求body和響應(yīng)body)说榆。
GET提交的數(shù)據(jù)會(huì)放在URL之后,以?分割URL和傳輸數(shù)據(jù)寸认,參數(shù)之間以&相連签财,如query?name=test1&id=123456。-
POST方法是把提交的數(shù)據(jù)放在HTTP包的請求body中偏塞。
GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對URL的長度有限制)唱蒸,而POST方法提交的數(shù)據(jù)沒有限制。
GET方式提交數(shù)據(jù)灸叼,會(huì)帶來安全問題神汹,比如一個(gè)登錄頁面,通過GET方式提交數(shù)據(jù)時(shí)怜姿,用戶名和密碼將出現(xiàn)在URL上慎冤,如果頁面可以被緩存或者其他人可以訪問這臺(tái)機(jī)器,就可以從歷史記錄獲得該用戶的賬號和密碼沧卢。
關(guān)于工具
“工欲善其事蚁堤,必先利其器”,目前比較流行的HTTP接口工具有postman(可以單獨(dú)安裝也可以作為Chrome的插件安裝)但狭、HttpRequest(火狐上的插件)披诗,或者自己寫個(gè)html的form表單提交也是可以的。