GET與POST的真正區別

Shealtiel_Li發表於2019-05-23

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

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

我們還是要用一句簡練的話來回答GET和POST的區別:


提及GET和POST的區別,一定要確定基於什麼前提。在不同的前提下有不同的答案。


這麼簡單的GET和POST背後有什麼神祕的面紗呢?我們今天依然用鄧哥的例子來講給大家~


哥家住在吃雞村,嫂家住在農藥屯。哥到嫂家可以有很多種選擇,走著去、駕車去、坐火車去等等。哥通常選擇駕車過去。


這裡吃雞村和農藥屯就相當於是網際網路中的兩臺計算機,鄧哥和鄧嫂相當於是這兩臺計算機中的兩個程式,這兩個程式之間想要通訊可以有很多種協議,就好比有很多種交通方式可以到達。我們假設駕車這種方式就是網路中的HTTP協議。


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


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

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


鄧哥要去接鄧嫂,就好比程式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請求有什麼區別是一個很簡單的問題哦~很多簡單的問題背後都有著很複雜的背景。

其實這也提醒著我們在學習和生活中不要失去好奇心。就像我們為什麼是站在地球上而不是飄在空中?太陽為什麼總是東昇西落?天空為什麼是藍色的而不是其他顏色?為什麼人類都有眼睛鼻子和嘴?
很多我們認為是理所當然的背後都有著它理所當然的道理。也許這個道理就是另一個全新世界的大門~!希望你能夠在這個浮躁的世界中保持著一顆純潔的好奇心~

這是小編的第一篇文章哦,專注小編,小編帶你看世界!!!!


相關文章