Get和Post是什么恩沽?呢蔫?? ? 是Http協(xié)議中的兩種請(qǐng)求的方法。
Http是什么飒筑?片吊?? ?Http是基于TCP/IP 的關(guān)于數(shù)據(jù)如何在萬(wàn)維網(wǎng)總通信的協(xié)議。
? ? ? ? Http的底層是TCP/IP协屡。所以Get和Post的底層也是TCP/IP 俏脊,也就是說(shuō)Get/Post都是TCP鏈接。Get和Post能做一樣的事情肤晓。
????????在萬(wàn)維網(wǎng)的世界中爷贫,TCP就像是騎車,我們用TCP來(lái)運(yùn)輸數(shù)據(jù)补憾,他很可靠漫萄,從來(lái)不會(huì)發(fā)生丟件少件的現(xiàn)象。但是如果路上跑的都是一模一樣的騎車盈匾,那么這個(gè)世界看起來(lái)一團(tuán)混亂腾务,送急件的騎車可能被前面滿載貨物的騎車攔在路上,真?zhèn)€交通一定會(huì)癱瘓削饵。為了避免這種情況發(fā)生岩瘦,交通規(guī)則Http誕生了。Http給啟程運(yùn)輸設(shè)定了好幾個(gè)服務(wù)類別窿撬,有Get启昧、Post、Put劈伴、Delete等等密末,Http規(guī)定,當(dāng)執(zhí)行Get請(qǐng)求的時(shí)候,要給汽車貼上Get的標(biāo)簽(method設(shè)置為Get)严里,而且要求把傳輸?shù)臄?shù)據(jù)放在車頂上(URL中)以方便記錄新啼,如果是Post請(qǐng)求,就要在汽車上貼上Post的標(biāo)簽田炭,并把貨物放在車廂里师抄。當(dāng)然漓柑,也可以在Get的時(shí)候偷偷往車廂里藏點(diǎn)貨教硫,但是這樣很不光彩;也可以在Post的時(shí)候再車頂上放一些數(shù)據(jù)辆布,讓人覺(jué)得傻乎乎的瞬矩。Http只是個(gè)行為準(zhǔn)則,二TCP才是Get和Post怎么實(shí)現(xiàn)的基本锋玲。
? ??????在萬(wàn)維網(wǎng)世界中景用,還有另一個(gè)重要的角色:運(yùn)輸公司。不同的瀏覽器(發(fā)起http請(qǐng)求)和服務(wù)器(接受http請(qǐng)求)就是不同的運(yùn)輸公司惭蹂。 雖然理論上伞插,你可以在車頂上無(wú)限的堆貨物(url中無(wú)限加參數(shù))。但是運(yùn)輸公司可不傻盾碗,裝貨和卸貨也是有很大成本的媚污,他們會(huì)限制單次運(yùn)輸量來(lái)控制風(fēng)險(xiǎn),數(shù)據(jù)量太大對(duì)瀏覽器和服務(wù)器都是很大負(fù)擔(dān)廷雅。業(yè)界不成文的規(guī)定是耗美,(大多數(shù))瀏覽器通常都會(huì)限制url長(zhǎng)度在2K個(gè)字節(jié),而(大多數(shù))服務(wù)器最多處理64K大小的url航缀。超過(guò)的部分商架,恕不處理。如果你用GET服務(wù)芥玉,在request body偷偷藏了數(shù)據(jù)蛇摸,不同服務(wù)器的處理方式也是不同的,有些服務(wù)器會(huì)幫你卸貨灿巧,讀出數(shù)據(jù)皇型,有些服務(wù)器直接忽略,所以砸烦,雖然GET可以帶request body弃鸦,也不能保證一定能被接收到哦。
? ??????GET和POST還有一個(gè)重大區(qū)別幢痘,
????????簡(jiǎn)單的說(shuō):
GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包唬格;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。
????????長(zhǎng)的說(shuō):
????????對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去购岗,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))汰聋;
????????而對(duì)于POST,瀏覽器先發(fā)送header喊积,服務(wù)器響應(yīng)100 continue烹困,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))乾吻。
????????也就是說(shuō)髓梅,GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟绎签,第一趟枯饿,先去和服務(wù)器打個(gè)招呼“嗨,我等下要送一批貨來(lái)诡必,你們打開門迎接我”奢方,然后再回頭把貨送過(guò)去。
????????因?yàn)镻OST需要兩步爸舒,時(shí)間上消耗的要多一點(diǎn)蟋字,看起來(lái)GET比POST更有效。因此Yahoo團(tuán)隊(duì)有推薦用GET替換POST來(lái)優(yōu)化網(wǎng)站性能扭勉。但這是一個(gè)坑鹊奖!跳入需謹(jǐn)慎。為什么剖效?
1. GET與POST都有自己的語(yǔ)義嫉入,不能隨便混用。
2. 據(jù)研究璧尸,在網(wǎng)絡(luò)環(huán)境好的情況下咒林,發(fā)一次包的時(shí)間和發(fā)兩次包的時(shí)間差別基本可以無(wú)視。而在網(wǎng)絡(luò)環(huán)境差的情況下爷光,兩次包的TCP在驗(yàn)證數(shù)據(jù)包完整性上垫竞,有非常大的優(yōu)點(diǎn)。
3. 并不是所有瀏覽器都會(huì)在POST中發(fā)送兩次包蛀序,F(xiàn)irefox就只發(fā)送一次欢瞪。
總結(jié)Get和Post的區(qū)別
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沒(méi)有限制吧凉。
8.GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上型诚,所以不能用來(lái)傳遞敏感信息客燕。
9.GET參數(shù)通過(guò)URL傳遞鸳劳,POST放在Request body中