一、原理區(qū)別
一般我們?cè)跒g覽器輸入一個(gè)網(wǎng)址訪問網(wǎng)站都是GET請(qǐng)求;再FORM表單中跟畅,可以通過設(shè)置Method指定提交方式為GET或者POST提交方式,默認(rèn)為GET提交方式幢码。
HTTP定義了與服務(wù)器交互的不同方法,其中最基本的四種:GET,POST锭部,PUT,DELETE面褐,HEAD拌禾,其中GET和HEAD被稱為安全方法,因?yàn)槭褂肎ET和HEAD的HTTP請(qǐng)求不會(huì)產(chǎn)生什么動(dòng)作展哭。不會(huì)產(chǎn)生動(dòng)作意味著GET和HEAD的HTTP請(qǐng)求不會(huì)在服務(wù)器上產(chǎn)生任何結(jié)果蹋砚。但是安全方法并不是什么動(dòng)作都不產(chǎn)生,這里的安全方法僅僅指不會(huì)修改信息摄杂。
根據(jù)HTTP規(guī)范,POST可能會(huì)修改服務(wù)器上的資源的請(qǐng)求循榆。比如CSDN的博客析恢,用戶提交一篇文章或者一個(gè)讀者提交評(píng)論是通過POST請(qǐng)求來實(shí)現(xiàn)的,因?yàn)樵偬峤晃恼禄蛘咴u(píng)論提交后資源(即某個(gè)頁面)不同了秧饮,或者說資源被修改了映挂,這些便是“不安全方法”。
二盗尸、表現(xiàn)形式區(qū)別
搞清楚了兩者的原理區(qū)別后柑船,我們來看一下在實(shí)際應(yīng)用中的區(qū)別。
首先泼各,我們先看一下HTTP請(qǐng)求的格式:
<method> <request-URL> <version>
<headers>
<entity-body>
在HTTP請(qǐng)求中鞍时,奇異行必須是一個(gè)請(qǐng)求行,包括請(qǐng)求方法扣蜻,請(qǐng)求URL逆巍,報(bào)文所用HTTP版本信息。緊接著是一個(gè)herders小節(jié)莽使,可以有零個(gè)或一個(gè)首部锐极,用來說明服務(wù)器要使用的附加信息。在首部之后就是一個(gè)空行芳肌,最后就是報(bào)文實(shí)體的主體部分灵再,包含一個(gè)由任意數(shù)據(jù)組成的數(shù)據(jù)塊肋层。但是并不是所有的報(bào)文都包含實(shí)體的主體部分。
GET請(qǐng)求實(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請(qǐng)求實(shí)例:
POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18
item=bandsaw 2647
接下來看看兩種請(qǐng)求方式的區(qū)別:
1翎迁、GET請(qǐng)求栋猖,請(qǐng)求的數(shù)據(jù)會(huì)附加在URL之后,以?分割URL和傳輸數(shù)據(jù)鸳兽,多個(gè)參數(shù)用&連接掂铐。URL的編碼格式采用的是ASCII編碼,而不是uniclde揍异,即是說所有的非ASCII字符都要編碼之后再傳輸全陨。
POST請(qǐng)求:POST請(qǐng)求會(huì)把請(qǐng)求的數(shù)據(jù)放置在HTTP請(qǐng)求包的包體中。上面的item=bandsaw就是實(shí)際的傳輸數(shù)據(jù)衷掷。
因此辱姨,GET請(qǐng)求的數(shù)據(jù)會(huì)暴露在地址欄中,而POST請(qǐng)求則不會(huì)戚嗅。
2雨涛、傳輸數(shù)據(jù)的大小
在HTTP規(guī)范中,沒有對(duì)URL的長度和傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制懦胞。但是在實(shí)際開發(fā)過程中替久,對(duì)于GET,特定的瀏覽器和服務(wù)器對(duì)URL的長度有限制躏尉。因此蚯根,在使用GET請(qǐng)求時(shí),傳輸數(shù)據(jù)會(huì)受到URL長度的限制胀糜。
對(duì)于POST颅拦,由于不是URL傳值,理論上是不會(huì)受限制的教藻,但是實(shí)際上各個(gè)服務(wù)器會(huì)規(guī)定對(duì)POST提交數(shù)據(jù)大小進(jìn)行限制距帅,Apache、IIS都有各自的配置括堤。
3碌秸、安全性
POST的安全性比GET的高。這里的安全是指真正的安全悄窃,而不同于上面GET提到的安全方法中的安全哮肚,上面提到的安全僅僅是不修改服務(wù)器的數(shù)據(jù)。比如广匙,在進(jìn)行登錄操作允趟,通過GET請(qǐng)求,用戶名和密碼都會(huì)暴露再URL上鸦致,因?yàn)榈卿涰撁嬗锌赡鼙粸g覽器緩存以及其他人查看瀏覽器的歷史記錄的原因潮剪,此時(shí)的用戶名和密碼就很容易被他人拿到了涣楷。除此之外,GET請(qǐng)求提交的數(shù)據(jù)還可能會(huì)造成Cross-site request frogery攻擊
4抗碰、HTTP中的GET狮斗,POST,SOAP協(xié)議都是在HTTP上運(yùn)行的
三弧蝇、HTTP響應(yīng)
HTTP響應(yīng)報(bào)文的格式
<version> <status> <reason-phrase>
<headers>
<entity-body>
status碳褒,狀態(tài)碼描述了請(qǐng)求過程中發(fā)生的情況
reson-phrase 是數(shù)字狀態(tài)碼的可讀版本
常見的狀態(tài)碼以及含義如下:
200 OK 服務(wù)器成功處理請(qǐng)求
301/302 Moved Permanently(重定向)請(qǐng)求的URL已移走。響應(yīng)報(bào)文中應(yīng)該包含一個(gè)Location URL看疗,說明資源現(xiàn)在所處的位置
304 Not Modified(未修改) 客戶的緩存資源是最新的沙峻,要客戶端使用緩存內(nèi)容
404 Not Found 未找到資源
501 Internal Server Error 服務(wù)器遇到錯(cuò)誤,使其無法對(duì)請(qǐng)求提供服務(wù)