第一次在掘金上寫東西,萌新表示現在瑟瑟發抖,哪裡說得不對還望各位大佬糾正┓( ´∀` )┏
最直觀的就是語義上的區別
- get用來獲取資料,post用來提交資料
- get引數有長度限制(受限於url長度,具體的數值取決於瀏覽器和伺服器的限制,最長2048位元組),而post無限制。
- get請求的資料會附加在url之 ,以 " ? "分割url和傳輸資料,多個引數用 "&"連線,而post請求會把請求的資料放在http請求體中。
- get是明文傳輸,post是放在請求體中,但是開發者可以通過抓包工具看到,也相當於是明文的。
- get請求會儲存在瀏覽器歷史記錄中,還可能儲存在web伺服器的日誌中
從當前角度來看,post相對get比較安全,至少請求的資料在url上不可見。然而真的只有這些嗎???
錯,錯了?????
- 那到底安全還是不安全呢?????
這個時候你首先得確定是用什麼來定義安全(舉個栗子)
- 你讓我爸爸媽媽叔叔阿姨去看這個url,你覺得安全嗎?
- 你讓一個初級測試工程師去測試這個介面,你覺得安全不?
- 你讓安全測試工程師去看看get請求呢? 所以人群不同,安全的定義就不一樣
- 真相
首先get和post在本質上都是tcp連結,但由於http協議和瀏覽器或者伺服器的限制,從而使它們在應用過程中產生了差別,但是它們中還有一個較大的區別:get在請求時傳送一個資料包,會將header和data一起傳送過去,而post會產生兩個資料包先傳送header,伺服器返回100,然後在傳送data,伺服器返回200
所以當你一層一層的把get和post剖析到底,你會發現他們的本質就是tcp連線,沒有啥區別,只是由於http協議規定和瀏覽器或者伺服器的限制,導致他們在應用過程中體現形式不同。
RFC是什麼鬼?
前段時間在看到有人在談論這個問題的時候有人扯出了RFC,那麼什麼是RFC呢。
- Request For Comments(RFC),是一系列以編號排定的檔案。檔案收集了有關網際網路相關資訊,以及UNIX和網際網路社群的軟體檔案。(來自百度百科)
這樣說吧!RFC就是網際網路的規範,我們通常所說的協議就是RFC的方式存在,http/1.1規範中RFC7231中涉及到了幾個http的方法,其中定義了幾個性質:
1.safe(安全)
這裡的安全和通常所理解的安全意義不同,就好比如果一個請求的語義本質上就是獲取資料(只讀),那麼這個請求就是安全的。客戶端向伺服器發起的請求如果沒有引起伺服器端任何的狀態變化,那麼他就是安全的而post請求來提交資料必然會是伺服器發生相應的變化。從這個維度來看,get請求相對伺服器而言,是安全的,post則不安全的。
ldempotend(冪等)
冪等通俗的來講就是指同一個請求執行多次和僅執行一次的效果完全相等。這裡來扯出冪等主要是為了處理同一個請求重複傳送的情況,假如在請求響應之前失去連線,如果這個請求時冪等的,那麼就可以放心的重發一次請求。所以可以得出get請求時冪等的,可以重複傳送請求,post請求時不冪等的,重複請求可能會發生無法預知的後果。
cacheable(可快取性)
顧名思義,就是一個請求是否可以被快取,絕大多數部分,post都是不可快取的(某些瀏覽器可能支援post快取),但get是可以快取的。
勉強理解一下大概就是:
get是請求獲取指定資源,get方法時安全、冪等、可快取的,get方法的報文主體沒有任何語義。
post是根據報文主體來對指定資源做出處理,post不安全,不冪等,不可快取(大部分情況下)。
好了,今天就先扯這麼多,有大佬發現不對請幫我糾正糾正,蟹蟹蟹蟹啦!先溜!