關(guān)于面試被問到post和get的區(qū)別???

當(dāng)?shù)谝淮蚊嬖嚨臅r(shí)候被問到說一說get和post有什么區(qū)別。當(dāng)時(shí)就說了一大堆很普遍很基礎(chǔ)的答案,什么post比get安全,get比post傳的少什么的。然而,面試官問,還有呢?
好家伙,面試完回去百度,整理了網(wǎng)上一堆的get和post的區(qū)別。整理如下:

  1. 從http標(biāo)準(zhǔn)來看,get比post安全,這里的安全是針對服務(wù)器而言的,get用于獲取數(shù)據(jù),不會(huì)引起數(shù)據(jù)的變化,并且是安全和冪等的。而post是有可能引起數(shù)據(jù)的變化。
  2. 從應(yīng)用角度來看,get參數(shù)是放在URL后面(通過URL傳遞),參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息,而post提交的數(shù)據(jù)會(huì)放置在Request body中,get請求會(huì)被瀏覽器主動(dòng)緩存post不會(huì),除非手動(dòng)設(shè)置。從這里看,post安全性比get高。GET請求只能進(jìn)行url編碼,而POST支持多種編碼方式。 GET請求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留。GET在瀏覽器回退時(shí)是無害的,而POST會(huì)再次提交請求。 GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。對參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符,而POST沒有限制。Get方式的提交頂多是1024字節(jié),理論上post沒有限制,可以傳較大量的數(shù)據(jù)。Get一般是獲取數(shù)據(jù),post是向服務(wù)器提交修改的數(shù)據(jù)。

再然后呢,去面試的時(shí)候自然自信滿滿。結(jié)果,還有沒有點(diǎn)別的,感覺有種答非所問的趕腳。
好吧,回去繼續(xù)百度深造。結(jié)果是這樣的:

GET和POST是什么?HTTP協(xié)議中的兩種發(fā)送請求的方法。
HTTP是什么?HTTP是基于TCP/IP的關(guān)于數(shù)據(jù)如何在萬維網(wǎng)中如何通信的協(xié)議。
HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數(shù),技術(shù)上是完全行的通的。

那所謂的區(qū)別呢?稍微總結(jié)了下(以下參考了在今日頭條看到的一篇文章)。
運(yùn)輸快遞需要車輛,而TCP就像車輛,但如果車輛全部按自己的想法走,交通就會(huì)癱瘓,所以交通規(guī)則HTTP誕生了。HTTP規(guī)定了運(yùn)輸方式:get、post、head、options、put等。當(dāng)執(zhí)行g(shù)et請求時(shí),車上貼get標(biāo)簽,貨物放在上層運(yùn)輸。如果是post請求,車上貼post標(biāo)簽,貨物放在下層運(yùn)輸。當(dāng)然,get方式也可以把貨物放在下層,但是這樣是算get還是post呢?所以,HTTP只是個(gè)行為準(zhǔn)則,而TCP才是GET和POST怎么實(shí)現(xiàn)的基本。

而關(guān)于傳遞的參數(shù)大小問題,是這樣的。
過大的數(shù)據(jù)量會(huì)增加運(yùn)輸成本,超出的部分,概不處理,那還不如乖按照規(guī)定走。所以,瀏覽器通常都會(huì)限制url長度在2K個(gè)字節(jié),而(大多數(shù))服務(wù)器最多處理64K大小的url。如果你用GET服務(wù),在request body偷偷藏了數(shù)據(jù),不同服務(wù)器的處理方式也是不同的,有些服務(wù)器會(huì)幫你卸貨,讀出數(shù)據(jù),有些服務(wù)器直接忽略,所以,雖然GET可以帶request body,也不能保證一定能被接收到哦。

GET和POST還有一個(gè)重大區(qū)別,簡單的說:
GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。
對于GET方式的請求,瀏覽器會(huì)把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù));
而對于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))

好吧,至于這個(gè)答案。面試有待驗(yàn)證。
至于面試,老老實(shí)實(shí)回答還是有必要的,暫時(shí)為以下答案:

  1. get在瀏覽器回退時(shí)是無害的,而post會(huì)再次請求
  2. get產(chǎn)生的url地址可以被收藏,而post不會(huì)
  3. get請求會(huì)被瀏覽器主動(dòng)緩存,而post不會(huì),除非手動(dòng)設(shè)置
  4. get請求只能進(jìn)行url編碼,而post支持多種編碼方式
  5. get請求參數(shù)會(huì)被完整保留在瀏覽歷史記錄里,而post中的參數(shù)不會(huì)被保留
  6. get 請求在url中傳送的參數(shù)有長度限制,而post沒有
  7. 對參數(shù)的數(shù)據(jù)類型,get只接受ascll字符,而post沒有限制
  8. get比post更安全,因?yàn)閰?shù)直接暴露在url上,所以不能用來傳遞敏感信息
  9. get參數(shù)通過url傳遞,poet放在request body中
    (記不住全部的,重點(diǎn)回答出1,2,5,6,9這幾點(diǎn)即可)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容