通俗理解上的區(qū)別:
1. GET請(qǐng)求的參數(shù)都放在URL里惨险,所以參數(shù)是直接暴露的肥印;而POST是通過(guò)request body 來(lái)傳遞參數(shù)的
?var xhr=new XMLHttpRequest()
?var body = new formData()
?body.append('A',A)
因此? 超鏈接 或者 瀏覽器地址欄直接輸U(kuò)RL 都是 GET請(qǐng)求方式
而表單(form)提交數(shù)據(jù)一般都是POST 請(qǐng)求方式
(而使用method 為 GET 的形式提交數(shù)據(jù)將會(huì)使提交的參數(shù)暴露到URL上)
GET傳數(shù)據(jù)會(huì)顯示于URL呀伙,如我們填寫數(shù)據(jù)提交后跳轉(zhuǎn)URL看到:www. abc. com/index.php?a=1 ?這個(gè)就代表GET傳的a數(shù)據(jù)為1。
POST傳數(shù)據(jù)是隱藏傳遞數(shù)據(jù),跳轉(zhuǎn)時(shí)URL網(wǎng)址是不帶數(shù)據(jù)舵鳞。
2.GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里蜂嗽,而POST中的參數(shù)不會(huì)被保留苗膝。
3.GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,傳送的數(shù)據(jù)量較小徒爹,不能大于2KB荚醒。POST傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制隆嗅。
4.對(duì)參數(shù)的數(shù)據(jù)類型界阁,GET只接受ASCII字符,而POST沒(méi)有限制胖喳。
現(xiàn)在泡躯,我們來(lái)看下get和post請(qǐng)求的本質(zhì):
首先,GET和POST是HTTP協(xié)議中的兩種發(fā)送請(qǐng)求的方法丽焊,從而可以得知:
1. GET和POST與數(shù)據(jù)如何傳遞沒(méi)有關(guān)系
GET和POST是由HTTP協(xié)議定義的较剃。在HTTP協(xié)議中,Method和Data(URL技健, Body写穴, Header)是正交的兩個(gè)概念,也就是說(shuō)雌贱,使用哪個(gè)Method與應(yīng)用層的數(shù)據(jù)如何傳輸是沒(méi)有相互關(guān)系的啊送。
HTTP沒(méi)有要求偿短,如果Method是POST數(shù)據(jù)就要放在BODY中。也沒(méi)有要求馋没,如果Method是GET昔逗,數(shù)據(jù)(參數(shù))就一定要放在URL中而不能放在BODY中。
那么篷朵,網(wǎng)上流傳甚廣的GET和POST的差異是從何而來(lái)的呢勾怒?我在HTML標(biāo)準(zhǔn)中,找到了相似的描述声旺。這和網(wǎng)上流傳的說(shuō)法一致笔链。但是這只是HTML標(biāo)準(zhǔn)對(duì)HTTP協(xié)議的用法的約定。怎么能當(dāng)成GET和POST的區(qū)別呢艾少?
而且卡乾,現(xiàn)代的Web Server都是支持GET中包含BODY這樣的請(qǐng)求。雖然這種請(qǐng)求不可能從瀏覽器發(fā)出缚够,但是現(xiàn)在的Web Server又不是只給瀏覽器用幔妨,已經(jīng)完全地超出了HTML服務(wù)器的范疇了。
2. HTTP協(xié)議對(duì)GET和POST都沒(méi)有對(duì)長(zhǎng)度的限制
HTTP協(xié)議明確地指出了谍椅,HTTP頭和Body都沒(méi)有長(zhǎng)度的要求误堡。而對(duì)于URL長(zhǎng)度上的限制,有兩方面的原因造成:
一方面是? 瀏覽器雏吭,(大多數(shù))瀏覽器通常都會(huì)限制URL長(zhǎng)度在2K個(gè)字節(jié)锁施,超過(guò)的部分,恕不處理杖们。
另一方面是? 服務(wù)器悉抵,(大多數(shù))服務(wù)器最多處理64K大小的URL。URL長(zhǎng)了摘完,對(duì)服務(wù)器處理也是一種負(fù)擔(dān)姥饰。原本一個(gè)會(huì)話就沒(méi)有多少數(shù)據(jù),現(xiàn)在如果有人惡意地構(gòu)造幾個(gè)幾M大小的URL孝治,并不停地訪問(wèn)你的服務(wù)器列粪。服務(wù)器的最大并發(fā)數(shù)顯然會(huì)下降。另一種攻擊方式是谈飒,把告訴服務(wù)器Content-Length是一個(gè)很大的數(shù)岂座,然后只給服務(wù)器發(fā)一點(diǎn)兒數(shù)據(jù),嘿嘿杭措,服務(wù)器你就傻等著去吧费什。哪怕你有超時(shí)設(shè)置,這種故意的次次訪問(wèn)超時(shí)也能讓服務(wù)器吃不了兜著走手素。有鑒于此吕喘,多數(shù)服務(wù)器出于安全啦赘那、穩(wěn)定啦方面的考慮,會(huì)給URL長(zhǎng)度加限制氯质。但是這個(gè)限制是針對(duì)所有HTTP請(qǐng)求的,與GET祠斧、POST沒(méi)有關(guān)系闻察。
此外,HTTP的底層是TCP/IP琢锋,所以GET和POST的底層也是TCP/IP辕漂,也就是說(shuō),GET/POST都是TCP鏈接吴超。