你必須知道的get與post的真正區別

咱們會常常看到有人問:http協議中GET請求和POST請求有什麼區別~?web

 

這個問題看似很簡單,可是不一樣程度的人會回答出不一樣的結果。在公司的面試中,也會常常的問及相似這樣的問題,看似很簡單,可是不一樣層次的人會回答出不一樣的結果。那麼咱們今天就來聊聊HTTP協議中GET與POST的真正區別。面試

 

咱們仍是要用一句簡練的話來回答GET和POST的區別:瀏覽器

說起GET和POST的區別,必定要肯定基於什麼前提。在不一樣的前提下有不一樣的答案。安全


 

 

這麼簡單的GET和POST背後有什麼神祕的面紗呢?咱們今天就用舉例子來說給你們~服務器

 

//////////網絡

 

鄧哥家住在吃雞村,鄧嫂家住在農藥屯。鄧哥到鄧嫂家能夠有不少種選擇,走着去、駕車去、坐火車去等等。鄧哥一般選擇駕車過去。app

 

這裏吃雞村和農藥屯就至關因而互聯網中的兩臺計算機,鄧哥和鄧嫂至關因而這兩臺計算機中的兩個程序,這兩個程序之間想要通訊能夠有不少種協議,就比如有不少種交通方式能夠到達。咱們假設駕車這種方式就是網絡中的HTTP協議。學習

 

鄧哥家有兩輛車,一輛轎車,一輛箱式貨車。編碼

 

兩種車就比如是HTTP協議中的兩種方式,咱們假設轎車是GET請求方式,箱式貨車是POST請求方式。url

 

有一天鄧哥想接鄧嫂來吃雞村玩,鄧哥準備開箱式貨車去接鄧嫂。

 

鄧哥要去接鄧嫂,就比如程序A要向程序B發出一個請求。從原理上說,不管是轎車仍是貨車都是車,都可以把人接回來。因此在本質上,GET請求和POST請求都能拉取數據。

 

這時候,鄧哥的父親(也就是隔壁老王)出來了,說道:「你是否是傻,去接人開轎車多好啊,開貨車幹嗎?費油不說,沒準人家那還不讓貨車停車呢!」

 

既然GET和POST均可以作到拉取數據,那麼爲何咱們一般拉取數據使用GET而不使用POST呢?

 

在故事中,隔壁老王不讓鄧哥開卡車去接鄧嫂,那麼在現實中,是否是也有一個「隔壁老王」這樣的角色在限制咱們呢?

 

答案是:有的!這個現實中的「隔壁老王」就是ISO國際標準化組織,這個組織也說了一堆相似隔壁老王的話,這堆話被稱爲RFC規範。

 

因此說,咱們常說的HTTP協議其實是基於RFC規範的,實際上GET和POST請求的語法是徹底相同的,可是在RFC規範中,給GET請求和POST請求規定了語義,規定GET用來獲取信息,POST用來發送信息。

 

當過年的時候,鄧哥想要給鄧嫂家送一些年貨的時候,鄧哥按照隔壁老王的囑咐,開着貨車給鄧嫂家送年貨去了。固然,送過去了一些蔬菜也會稍微拉回來一點水果~

 

這就是按照RFC的規範來執行的,當鄧哥想要送年貨的時候,就會開貨車過去;在互聯網環境中,若是想要發送信息就要使用POST方法。

POST方法雖然是發送消息的,但也是有Response的,在請求返回的時候帶回來一點數據也是被容許的。

 

那麼這時候問題又來了,鄧哥若是不聽老王的怎麼辦?那這個規範不就沒有做用了嗎?這個時候老王也是頗有辦法的,老王就坐在院子門口,若是鄧哥想運貨出去的時候,開的不是貨車就不讓出院門~

 

光有規範沒有具體的軟件實施也是沒有意義的,因此不少的軟件聽從了RFC的規範,好比咱們熟悉的Chrome瀏覽器。因此咱們想用GET方式發送文件或者圖片是不可能的~就像鄧哥不可能用轎車去給鄧嫂送年貨同樣。

 

因此咱們最後來總結一下:

 

當人們問起GET和POST的區別時,咱們要先肯定,這裏的GET和POST是基於什麼前提的?

 

1. 若是什麼前提都沒有,也就是不用任何規範限制的話,咱們只考慮語法來講,這兩個方式是沒有任何區別的,只有名字不同。

 

2. 若是是基於RFC規範的,那麼問題就又來了。是基於RFC理論的,仍是基於具體的實現的。

 

1)若是是基於RFC理論的,咱們稱這個爲Specification。那麼GET和POST是具備相同的語法,可是不具有相同的語義,GET方式用做獲取信息,POST方式用做發送信息。

 

2)若是是基於RFC的具體實現的,咱們稱之爲implementation。其實要區分是具體的哪種實現。咱們一般默認指的是瀏覽器實現的RFC。固然不止瀏覽器,咱們任何人均可以設計一個HTTP協議的接口,使用RFC規範,固然這些是咱們不用考慮的,由於並不通用。

 

因此咱們只須要考慮瀏覽器實現的RFC,或者說Web環境下的RFC。這個前提下的答案,就是咱們最多見的那些。我就簡單的列舉在下面了~

 

a) GET的數據在 URL 中對全部人都是可見的。POST的數據不會顯示在 URL 中。

 

b) GET對數據長度有限制,當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符)。POST無限制。

 

c) GET可收藏爲書籤,POST不可收藏爲書籤。

 

d) GET後退按鈕/刷新無影響,POST數據會被從新提交(瀏覽器應該告知用戶數據會被從新提交)。

 

e) GET編碼類型application/x-www-form-url,POST編碼類型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼。

 

f) GET歷史參數會保留在瀏覽器歷史中。POST參數不會保存在瀏覽器歷史中。

 

g) GET只容許 ASCII 字符。POST沒有限制。也容許二進制數據。

 

h) 與 POST 相比,GET 的安全性較差,由於所發送的數據是 URL 的一部分。在發送密碼或其餘敏感信息時毫不要使用 GET !POST 比 GET 更安全,由於參數不會被保存在瀏覽器歷史或 web 服務器日誌中。

 

以上這些點都是咱們常見的,還有一些咱們不常見的,好比GET請求只會有一次TCP鏈接,而POST請求會有兩次TCP鏈接。在這背後也有許多的設計和考慮~

 

因此在咱們不要認爲GET和POST請求有什麼區別是一個很簡單的問題哦~不少簡單的問題背後都有着很複雜的背景。

 

 

//////////

 

其實這也提醒着咱們在學習和生活中不要失去好奇心。就像咱們爲何是站在地球上而不是飄在空中?太陽爲何老是東昇西落?天空爲何是藍色的而不是其餘顏色?爲何人類都有眼睛鼻子和嘴?

 

不少咱們認爲是理所固然的背後都有着它理所固然的道理。也許這個道理就是另外一個全新世界的大門~!但願你可以在這個浮躁的世界中保持着一顆純潔的好奇心~!

 

若是你是個技術小白,也歡迎你來到咱們的討論羣,在這裏咱們會一塊兒討論技術相關的問題,俗話說的好,三個臭皮匠勝過諸葛亮嘛,也許多幾我的出主意,你的技術難題就被瞬間攻破了呢。在這裏咱們還會一塊兒分享資源,不管是學習的仍是一些面試題啦,還有一些一線互聯網公司的招聘信息。

 

相關文章
相關標籤/搜索