一、url介紹
說起URL,大家第一反應可能是這不就是一個地址嗎,還能有什么門道?
URL是Uniform Resource Locator的縮寫,稱為統一資源定位符。URL正是使用web瀏覽器訪問web頁面時需要輸入的網頁地址。URL是一種強有力的工具。但URL並不完美。它表示的是實際的地址,而不是准確的名字。這種方案的缺點在於如果資源被移走了,URL也就不再有效了。那么它就無法對對象進行定位了 。
URL的構成
一個標准的URL語法組成是下面這樣的:
scheme://login:password@address:port/path_to_resource?query_string#fragment
簡化下上面的組成,就可以把URL分成下面四部分:
傳輸協議 + 域名或IP地址 + [端口(端口為80時可省略)] + 資源路徑 + 查詢字符串
如果要指定訪問端口時需要用“:”來隔開,例如(http://www.baidu.com:80/index.php)
1、傳輸協議
協議名稱是由一串不區分大小寫的字母組成,以 : 作為結束符。協議所表示的是獲取該資源需要使用的協議。如HTTP、HTTPS等。常見的協議有:
-
http
http是一種超文本傳輸協議,除了沒有用戶名和密碼之外,與通用的URL格式相符。如果省略了端口,就默認為80。
基本格式:http://<host>:<port>/<path>?<query>#<frag>
示例:http://www.baidu.com/index.html 或 http://www.baidu.com:80/index.html -
https
https與http是一對,唯一的區別在於https在http的基礎上加上了SSL, SSL為http連接提供了端到端的加密機制。其語法與http的語法相同,默認端口為443。
基本格式:https://<host>:<port>/<path>?<query>#<frag>
示例:https://kyfw.12306.cn/otn/leftTicket/init -
mailto
mailto URL指向的是E-mail地址,由於E-mail的行為與其他方案都有所不同(它並不指向任何可以直接訪問的對象),所以mailto URL的格式與標准URL的格式也有所不同。
示例:mailto:alany@gmail.com -
ftp
ftp協議是文件傳輸協議,通過該協議的URL可以從FTP服務器上下載或向其上傳文件,並獲取FTP服務器上的目錄結構內容的列表。
基本格式:ftp://<user>:<password>@<host>:<port>/<path>;<params>
示例:ftp://root:test2017@tsinghua.edu:21/pub/gnu/
鑒於主題和篇幅關系,其他的協議就不一一介紹了,有興趣可以額外搜索了解。
2、主機和端口
要想在互聯網上找到資源,應用程序要知道是哪台機器裝載了資源,以及在那台機器的什么地方可以找到能對目標資源進行訪問的服務器,URL的主機和端口組件提供了這兩組信息。
-
主機標識了互聯網上能夠訪問資源的宿主機器。可以用上述域名(www.baidu.com)或者IP地址(14.215.177.38)來表示主機名。
-
端口組件標識了服務器正在監聽的網絡端口,對下層使用了TCP協議的HTTP來說,默認端口號就是80。
3、資源路徑
URL的資源路徑說明了需要訪問的資源位於服務器的什么地方,路徑通常就像一個分級的文件系統路徑。
示例:https://github.com/AlanYangs/Log4Reports/blob/master/pom.xml
這個URL中的路徑為/AlanYangs/Log4Reports/blob/master/pom.xml,很像UNIX文件系統中的文件系統路徑。路徑是服務器定位資源時所需的信息,可以用字符“/”將HTTP URL的路徑組件划分成一些路徑段(path segment)。
4、查詢字符串
很多資源,比如數據庫服務,都是可以通過査詢來縮小所請求資源類型范圍的。假設數據庫中維護着一個未售貨物的清單,並可以對淸單進行査詢,以判斷產品是否有貨,那就可以用下列URL來査詢Web數據庫網關,看看id為12731、顏色為blue、尺寸為large的條目是否有貨:
http://www.test.com/query?id=12731&color=blue&size=large
分析下上面的URL,發現問號(?)右邊的內容是前面沒有出現的,這部分可以稱為查詢(query)組件,通常是以鍵值對的形式出現,多個鍵值對之間用&連接。此外,對於查詢字符串除了有些不合規則的字符(比如空格等)還需要轉碼處理。
HTTP的請求的方式
這一部分從內容上看貌似應該放在上一篇《關於HTTP》中說明的,放在URL中來說明是為了更好的理解GET和POST方式的區別。HTTP的請求的方式有多種,打開一個HTTP接口工具(PostMan),可以查看下請求的類型:
請求類型有這么多,我們通常只需要關注GET和POST就好,下面具體介紹下GET和POST方法的URL樣式及對比。
1、URL樣式
-
GET - 通常是從指定的服務器中獲取數據,查詢字符串(鍵值對)被附加在URL地址后面一起發送到服務器,如下面這樣的:http://localhost:8090/api/query?id=3,在postman中的請求示例如下:
-
POST - 通常是提交數據給指定的服務器處理,當然也可以從服務器獲取數據。使用POST方法時,查詢字符串或發送的數據在POST信息中單獨存在,和請求URL一起發送到服務器,而不是像GET方法一樣直接放在URL中。在postman中的請求示例如下:
2、GET和POST的區別
-
從上面的例子我們可以看到,GET請求消息體(body)為空,POST請求帶有消息體(請區分請求body和響應body)。
-
GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如query?name=test1&id=123456。-
-
POST方法是把提交的數據放在HTTP包的請求body中。
-
GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制。
-
GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這台機器,就可以從歷史記錄獲得該用戶的賬號和密碼。
-
轉https://mp.weixin.qq.com/s?__biz=MzIwMzc5ODQzNw==&mid=2247483982&idx=1&sn=75d1902379c33538517560a4eeb1b7b3&chksm=96c8a084a1bf29928b97e36500253d5952e51b6887a6b447ffd042e1cd168f67b4de20cc0b65&mpshare=1&scene=1&srcid=09223rd3IPCi2wQaL5ZtsTqM&sharer_sharetime=1569128787059&sharer_shareid=a8f2116646f9ea11f7e2e041c9c0a24f&pass_ticket=y8pxJfEpSxW4cSUmgxQyv5jt3yElHlDi%2FBASuJRaEbp8qKyzB01d9nH55llYmWna#rd