關(guān)于URL
說(shuō)起URL,大家第一反應(yīng)可能是這不就是一個(gè)地址嗎,還能有什么門(mén)道?
URL是Uniform Resource Locator的縮寫(xiě),稱為統(tǒng)一資源定位符。URL正是使用web瀏覽器訪問(wèn)web頁(yè)面時(shí)需要輸入的網(wǎng)頁(yè)地址。URL是一種強(qiáng)有力的工具。但URL并不完美。它表示的是實(shí)際的地址,而不是準(zhǔn)確的名字。這種方案的缺點(diǎn)在于如果資源被移走了,URL也就不再有效了。那么它就無(wú)法對(duì)對(duì)象進(jìn)行定位了 。
URL的構(gòu)成
一個(gè)標(biāo)準(zhǔn)的URL語(yǔ)法組成是下面這樣的:
scheme://login:password@address:port/path_to_resource?query_string#fragment
簡(jiǎn)化下上面的組成,就可以把URL分成下面四部分:
傳輸協(xié)議 + 域名或IP地址 + [端口(端口為80時(shí)可省略)] + 資源路徑 + 查詢字符串
如果要指定訪問(wèn)端口時(shí)需要用“:”來(lái)隔開(kāi),例如(http://www.baidu.com:80/index.php)
1、傳輸協(xié)議
協(xié)議名稱是由一串不區(qū)分大小寫(xiě)的字母組成,以 : 作為結(jié)束符。協(xié)議所表示的是獲取該資源需要使用的協(xié)議。如HTTP、HTTPS等。常見(jiàn)的協(xié)議有:
http
http是一種超文本傳輸協(xié)議,除了沒(méi)有用戶名和密碼之外,與通用的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是一對(duì),唯一的區(qū)別在于https在http的基礎(chǔ)上加上了SSL, SSL為http連接提供了端到端的加密機(jī)制。其語(yǔ)法與http的語(yǔ)法相同,默認(rèn)端口為443。
基本格式:https://<host>:<port>/<path>?<query>#<frag>
示例:https://kyfw.12306.cn/otn/leftTicket/init
mailto
mailto URL指向的是E-mail地址,由于E-mail的行為與其他方案都有所不同(它并不指向任何可以直接訪問(wèn)的對(duì)象),所以mailto URL的格式與標(biāo)準(zhǔn)URL的格式也有所不同。
ftp
ftp協(xié)議是文件傳輸協(xié)議,通過(guò)該協(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ī)器的什么地方可以找到能對(duì)目標(biāo)資源進(jìn)行訪問(wèn)的服務(wù)器,URL的主機(jī)和端口組件提供了這兩組信息。
主機(jī)標(biāo)識(shí)了互聯(lián)網(wǎng)上能夠訪問(wèn)資源的宿主機(jī)器??梢杂蒙鲜鲇蛎?www.baidu.com)或者IP地址(14.215.177.38)來(lái)表示主機(jī)名。
端口組件標(biāo)識(shí)了服務(wù)器正在監(jiān)聽(tīng)的網(wǎng)絡(luò)端口,對(duì)下層使用了TCP協(xié)議的HTTP來(lái)說(shuō),默認(rèn)端口號(hào)就是80。
3、資源路徑
URL的資源路徑說(shuō)明了需要訪問(wèn)的資源位于服務(wù)器的什么地方,路徑通常就像一個(gè)分級(jí)的文件系統(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ù)庫(kù)服務(wù),都是可以通過(guò)査詢來(lái)縮小所請(qǐng)求資源類型范圍的。假設(shè)數(shù)據(jù)庫(kù)中維護(hù)著一個(gè)未售貨物的清單,并可以對(duì)淸單進(jìn)行査詢,以判斷產(chǎn)品是否有貨,那就可以用下列URL來(lái)査詢Web數(shù)據(jù)庫(kù)網(wǎng)關(guān),看看id為12731、顏色為blue、尺寸為large的條目是否有貨:
http://www.test.com/query?id=12731&color=blue&size=large
分析下上面的URL,發(fā)現(xiàn)問(wèn)號(hào)(?)右邊的內(nèi)容是前面沒(méi)有出現(xiàn)的,這部分可以稱為查詢(query)組件,通常是以鍵值對(duì)的形式出現(xiàn),多個(gè)鍵值對(duì)之間用&連接。此外,對(duì)于查詢字符串除了有些不合規(guī)則的字符(比如空格等)還需要轉(zhuǎn)碼處理。
HTTP的請(qǐng)求的方式
這一部分從內(nèi)容上看貌似應(yīng)該放在上一篇《關(guān)于HTTP》中說(shuō)明的,放在URL中來(lái)說(shuō)明是為了更好的理解GET和POST方式的區(qū)別。HTTP的請(qǐng)求的方式有多種,打開(kāi)一個(gè)HTTP接口工具(PostMan),可以查看下請(qǐng)求的類型:

postman
請(qǐng)求類型有這么多,我們通常只需要關(guān)注GET和POST就好,下面具體介紹下GET和POST方法的URL樣式及對(duì)比。
1、URL樣式
GET - 通常是從指定的服務(wù)器中獲取數(shù)據(jù),查詢字符串(鍵值對(duì))被附加在URL地址后面一起發(fā)送到服務(wù)器,如下面這樣的:http://localhost:8090/api/query?id=3,在postman中的請(qǐng)求示例如下:

POST - 通常是提交數(shù)據(jù)給指定的服務(wù)器處理,當(dāng)然也可以從服務(wù)器獲取數(shù)據(jù)。使用POST方法時(shí),查詢字符串或發(fā)送的數(shù)據(jù)在POST信息中單獨(dú)存在,和請(qǐng)求URL一起發(fā)送到服務(wù)器,而不是像GET方法一樣直接放在URL中。在postman中的請(qǐng)求示例如下:

2、GET和POST的區(qū)別
從上面的例子我們可以看到,GET請(qǐng)求消息體(body)為空,POST請(qǐng)求帶有消息體(請(qǐng)區(qū)分請(qǐng)求body和響應(yīng)body)。
GET提交的數(shù)據(jù)會(huì)放在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如query?name=test1&id=123456。-
POST方法是把提交的數(shù)據(jù)放在HTTP包的請(qǐng)求body中。
GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長(zhǎng)度有限制),而POST方法提交的數(shù)據(jù)沒(méi)有限制。
GET方式提交數(shù)據(jù),會(huì)帶來(lái)安全問(wèn)題,比如一個(gè)登錄頁(yè)面,通過(guò)GET方式提交數(shù)據(jù)時(shí),用戶名和密碼將出現(xiàn)在URL上,如果頁(yè)面可以被緩存或者其他人可以訪問(wèn)這臺(tái)機(jī)器,就可以從歷史記錄獲得該用戶的賬號(hào)和密碼。
關(guān)于工具
“工欲善其事,必先利其器”,目前比較流行的HTTP接口工具有postman(可以單獨(dú)安裝也可以作為Chrome的插件安裝)、HttpRequest(火狐上的插件),或者自己寫(xiě)個(gè)html的form表單提交也是可以的。