一厘灼、背景介紹
基本概念
HTTP:在Web應(yīng)用中岸霹,服務(wù)器把網(wǎng)頁(yè)傳給瀏覽器,實(shí)際上就是把網(wǎng)頁(yè)的HTML代碼發(fā)送給瀏覽器裁蚁,讓瀏覽器顯示出來(lái)。而瀏覽器和服務(wù)器之間的傳輸協(xié)議是HTTP继准。HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬(wàn)維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議枉证。
工作原理:HTTP協(xié)議工作于客戶端-服務(wù)端,瀏覽器作為HTTP客戶端通過(guò)URL(統(tǒng)一資源定位符)向HTTP服務(wù)端發(fā)送請(qǐng)求,服務(wù)器接收到請(qǐng)求后,向客戶端發(fā)送響應(yīng)信息。
消息結(jié)構(gòu)
客戶端請(qǐng)求消息:由請(qǐng)求行移必、請(qǐng)求頭部室谚、空行、請(qǐng)求數(shù)據(jù)組成崔泵。
GET:請(qǐng)求指定的頁(yè)面信息秒赤,并返回實(shí)體主體
POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中憎瘸。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改入篮。
二.知識(shí)剖析
get與post的區(qū)別
1.GET方式
1.GET方式是通過(guò)URL請(qǐng)求傳遞用戶所輸入的內(nèi)容,其提交的內(nèi)容會(huì)全部顯示的瀏覽器的地址欄中幌甘;其安全性很低潮售。如果用戶輸入的內(nèi)容包含密碼之類的私人信息時(shí)很容易被其他人獲取。
2.GET方式提交需要用到Request.QueryString來(lái)取得變量的值锅风。
3.GET提交具有長(zhǎng)度限制酥诽,最長(zhǎng)不能超過(guò)2048字節(jié)。
4.GET是從服務(wù)器上獲取數(shù)據(jù)皱埠。
5.GET是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的action屬性所指的URL中盆均,值和表單內(nèi)容一一對(duì)應(yīng),在URL中可以看到漱逸。
6.在頁(yè)面重新刷新載入時(shí)泪姨,沒有提示框詢問(wèn)“是否重新發(fā)送請(qǐng)求”。
7.在做請(qǐng)求時(shí)饰抒,GET是將表單內(nèi)容放到信息的請(qǐng)求頭中肮砾。
2.POST方式
1.POST提交不會(huì)將用戶所輸入的個(gè)人信息顯示在瀏覽器的地址欄中且地址欄中沒有什么變化。
2.POST方式提交需要用到Request.Form來(lái)取得變量的值袋坑。
3.POST沒有提交長(zhǎng)度限制仗处。
4.POST是向服務(wù)器傳送數(shù)據(jù)。
5.POST是通過(guò)HTTP post機(jī)制枣宫,將表單內(nèi)容 中各個(gè)字段與其內(nèi)容旋轉(zhuǎn)在HTML HEADER內(nèi)一起傳送到action屬性所批的URL地址婆誓。用戶是看不到這一過(guò)程的。
6.在頁(yè)面重新刷新載入時(shí)也颤,會(huì)有提示框詢問(wèn)“是否重新發(fā)送請(qǐng)求”洋幻。
3.冪等
先介紹下冪等的概念:如果一個(gè)操作沒有副作用,或者多次操作對(duì)資源產(chǎn)生的副作用相同翅娶,我們就說(shuō)這個(gè)操作是冪等的文留。
get方法用戶獲取資源,沒有副作用竭沫,所以是冪等的燥翅;post用于創(chuàng)建資源,是有副作用的蜕提,且副作用不同森书,所以post不是冪等的。(兩次相同的POST請(qǐng)求會(huì)在服務(wù)器端創(chuàng)建兩份資源谎势,它們具有不同的URI)
上圖是在W3C上找到的答案凛膏。
總結(jié)一下:
1.GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求它浅。
2.GET產(chǎn)生的URL地址可以被Bookmark译柏,而POST不可以。
3.GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache姐霍,而POST不會(huì)鄙麦,除非手動(dòng)設(shè)置。
4.GET請(qǐng)求只能進(jìn)行url編碼镊折,而POST支持多種編碼方式胯府。
5.GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留恨胚。
6.GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的骂因,而POST沒有。
7.對(duì)參數(shù)的數(shù)據(jù)類型赃泡,GET只接受ASCII字符寒波,而POST沒有限制乘盼。
8.GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上俄烁,所以不能用來(lái)傳遞敏感信息绸栅。
9.GET參數(shù)通過(guò)URL傳遞,POST放在Request body中页屠。
三粹胯、常見問(wèn)題
GET和POST使用環(huán)境?
四辰企、解決方案
應(yīng)該符合語(yǔ)義的使用;即獲取數(shù)據(jù)使用GET风纠,增加數(shù)據(jù)使用POST。
當(dāng)請(qǐng)求無(wú)副作用時(shí)(如進(jìn)行搜索)牢贸,便可使用GET方法竹观;當(dāng)請(qǐng)求有副作用時(shí)(如添加數(shù)據(jù)行),則用POST方法十减。
五栈幸、編碼實(shí)戰(zhàn)
六、擴(kuò)展思考
application json 與form表單的區(qū)別帮辟?
application/json
隨著json規(guī)范的越來(lái)越流行速址,并且瀏覽器支持程度原來(lái)越好,許多開發(fā)人員以application/json作為請(qǐng)求content-type由驹,告訴服務(wù)器請(qǐng)求的主題內(nèi)容是json格式的字符串芍锚,服務(wù)器端會(huì)對(duì)json字符串進(jìn)行解析,這種方式的好處就是前端人員不需要關(guān)心數(shù)據(jù)結(jié)構(gòu)的復(fù)雜度蔓榄,只要是標(biāo)準(zhǔn)的json格式就能提交成功并炮,application/json數(shù)據(jù)格式越來(lái)越得到開發(fā)人員的青睞。
application/x-www-form-urlencoded方式
是Jquery的Ajax請(qǐng)求默認(rèn)方式甥郑,這種方式的好處就是瀏覽器都支持逃魄,在請(qǐng)求發(fā)送過(guò)程中會(huì)對(duì)數(shù)據(jù)進(jìn)行序列化處理,以鍵值對(duì)形式澜搅?key1=value1&key2=value2的方式發(fā)送到服務(wù)器伍俘,如果用Jquery,它內(nèi)部已經(jīng)進(jìn)行了處理勉躺,如果自己寫原生的Ajax請(qǐng)求癌瘾,就需要自己對(duì)數(shù)據(jù)進(jìn)行序列化。
七饵溅、更多討論
分別在什么情況下運(yùn)用post和get妨退?
八、參考文獻(xiàn)
參考一:W3C
參考二:知乎——get和post區(qū)別?
參考三:AJAX和表單提交中GET與POST的區(qū)別
參考四:99%的人理解錯(cuò) HTTP 中 GET 與 POST 的區(qū)別
參考五:聽說(shuō)『99% 的人都理解錯(cuò)了 HTTP 中 GET 與 POST 的區(qū)別』咬荷?冠句?
參考六:application/json 和 application/x-www-form-urlencoded的區(qū)別