這個(gè)已經(jīng)被廣大志同道合的好友們討論爛的話題往湿,我依舊要再翻一遍,誰讓我是菜雞呢
談?wù)撝拔覀兿葋砹私庖幌率裁词莋et和post
一俘闯、原理的區(qū)別
我們都知道蒲拉,網(wǎng)絡(luò)通常分為兩部分肃拜,服務(wù)端和客戶端痴腌。就比如說:我訪問一個(gè)網(wǎng)頁,我就是一個(gè)客戶端燃领,訪問的網(wǎng)頁就是一個(gè)服務(wù)端士聪。那么這兩者之間是通過什么來交互的呢?就是我們說的網(wǎng)絡(luò)請求猛蔽。
HTTP定義了與服務(wù)器交互的不同方法:其中最基本的四種方法是:get,post,put,delete.他們對應(yīng)了剥悟,查,改曼库,增区岗,刪。
一般我們在瀏覽器輸入網(wǎng)址訪問網(wǎng)站的方式都是get請求毁枯;在Form表單中躏尉,可以通過設(shè)置method指定提交數(shù)據(jù)的方式為post或者get,默認(rèn)是get方式后众。
get被稱為安全方法,因?yàn)槭褂胓et的http請求不會產(chǎn)生什么動(dòng)作颅拦。這就意味著get的http請求不會在服務(wù)器上產(chǎn)生任何結(jié)果蒂誉。但是安全方法并不是什么動(dòng)作都產(chǎn)生,這里的安全方法僅僅指的是不會修改信息距帅。
根據(jù)http規(guī)范右锨,post可能會修改服務(wù)器上的資源請求。比如碌秸,CSDN的博客绍移,用戶提交一片文章是通過post請求來實(shí)現(xiàn)的,因?yàn)樵谔峤晃恼潞蠹サ纾Y源不同了蹂窖,或者資源被修改了,這些便是不安全方法恩敌。
二瞬测、實(shí)際應(yīng)用的區(qū)別
首先我們來看一下http請求的格式:
<method> <request-URL> <version>
<headers>
<entity-body>
在HTTP請求中,第一行必須是一個(gè)請求行纠炮,包括請求方法月趟,請求URL,報(bào)文所用HTTP版本信息恢口。緊接著是一個(gè)herders小節(jié)孝宗,可以有零個(gè)或一個(gè)首部,用來說明服務(wù)器要使用的附加信息耕肩。在首部之后就是一個(gè)空行因妇,最后就是報(bào)文實(shí)體的主體部分问潭,包含一個(gè)由任意數(shù)據(jù)組成的數(shù)據(jù)塊。但是并不是所有的報(bào)文都包含實(shí)體的主體部分沙峻。
get請求的實(shí)例
GET http://weibo.com/signup/signup.php?inviteCode=2388493434
Host: weibo.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
post請求的實(shí)例
POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18
item=bandsaw 2647
看完這兩種方式的實(shí)例睦授,讓我們總結(jié)一下這兩者的區(qū)別:
1,請求數(shù)據(jù)的數(shù)據(jù)位置
GET請求摔寨,請求的數(shù)據(jù)會附加在URL之后去枷,以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接是复。URL的編碼格式采用的是ASCII編碼删顶,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸淑廊。
POST請求:POST請求會把請求的數(shù)據(jù)放置在HTTP請求包的包體中逗余。上面的item=bandsaw就是實(shí)際的傳輸數(shù)據(jù)。
因此季惩,GET請求的數(shù)據(jù)會暴露在地址欄中录粱,而POST請求則不會。
2画拾,傳輸數(shù)據(jù)的大小
在HTTP規(guī)范中啥繁,沒有對URL的長度和傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制。但是在實(shí)際開發(fā)過程中青抛,對于GET旗闽,特定的瀏覽器和服務(wù)器對URL的長度有限制。因此蜜另,在使用GET請求時(shí)适室,傳輸數(shù)據(jù)會受到URL長度的限制。
對于POST举瑰,由于不是URL傳值捣辆,理論上是不會受限制的,但是實(shí)際上各個(gè)服務(wù)器會規(guī)定對POST提交數(shù)據(jù)大小進(jìn)行限制此迅,Apache罪帖、IIS都有各自的配置。
3邮屁,安全性
POST的安全性比GET的高整袁。這里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全佑吝,上面提到的安全僅僅是不修改服務(wù)器的數(shù)據(jù)坐昙。比如,在進(jìn)行登錄操作芋忿,通過GET請求炸客,用戶名和密碼都會暴露再URL上疾棵,因?yàn)榈卿涰撁嬗锌赡鼙粸g覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時(shí)的用戶名和密碼就很容易被他人拿到了痹仙。除此之外是尔,GET請求提交的數(shù)據(jù)還可能會造成Cross-site request frogery攻擊
參考文章: