get 和 post 是兩種最常用的 HTTP 請求方法,要說它們兩個的區別,相必接觸過 WEB 開發的人都能夠說出一二。
如果我問你這個問題,你的內心充滿了自信和喜悅。你可能已經寫過無數個 GET 和 POST 請求,也可能看過很多“權威網站”總結出的他們的區別,你非常清楚知道什么時候該用什么。
於是你在心里默念...
從本質上來說,get 是向服務器請求數據,而 post 是向服務器提交要被處理的數據。
最直觀的區別是 get 的請求參數是在 url 中發送的,而 post 的請求參數是在 HTTP 消息主體中發送的。
然后你輕輕松松、瀟瀟灑灑的給出了一個“標准答案”:
標准答案
- get 在回退和刷新時是無害的,post 的數據會被重新提交。
- get 的參數可以被書簽和歷史記錄保存,post 的參數不能被書簽和歷史記錄保存。
- get 只支持 url 分割(application/x-www-form-urlencoded)的格式,post 支持多種編碼格式,如:url 分割、FormData、text/plain、json 等。
- get 在 url 中添加的參數有長度限制,post 的參數長度沒有限制。
- get 只允許 ASCII 字符的數據類型,post 沒有數據類型的限制。
- get 相對 post 來說安全性較差,因為 get 的參數直接在 url 中對所有人可見。因此不要在發送密碼或其他敏感信息時使用 get 方法。
以上標准答案來自於:w3school
get 和 post 本質上沒有區別
很遺憾,這並不是我期待的答案!如果我告訴你 get 和 post 本質上沒有區別 ,你信么?
要想說清楚這個問題,我們就要先回到一切開始的地方。
get 和 post 是什么?get 和 post 是兩種最常用的 HTTP 請求方法。
那么 HTTP 又是什么?HTTP 是基於 TCP/IP 進行客戶端和服務器之間通信的超文本傳輸協議。
HTTP 的底層是 TCP/IP 。所以 GET 和 POST 的底層也是 TCP/IP ,也就是說,GET/POST 都是TCP鏈接。GET 和 POST 能做的事情是一樣一樣的。你把 GET 參數加到 HTTP 消息主體中,或者給 POST 帶上 url 參數,技術上是完全行的通的。
get 和 post 的區別是怎么來的
看到這里你又會問了,既然沒有區別,那么上面的“標准答案”又是怎么回事?
注意,並沒有人說“標准答案”有誤。只是上邊的區別是依賴於瀏覽器/服務器而存在的。
數據傳輸就相當於貨物運輸,裝貨和卸貨就相當於數據的發送和接收。如果運輸公司(瀏覽器和服務器)不對貨物運輸進行規范,任由他們無限的堆積貨物、隨意的隱秘貨品。那么勢必會對運輸公司造成負擔,產生很大額外的經濟成本。所以他們就協商了一套業內規范(HTTP 協議),不同的貨物用不同的裝載方式(不同的請求方法),裝載貨物的多少也進行了限制(瀏覽器一般限制 url 長度在 2K 內,服務器最多處理 64K 大小的 url)。
所以看到這里你應該明白了吧。GET 和 POST 本質上都是 TCP 鏈接,並無差別。由於 HTTP 的規范和瀏覽器/服務器的限制,才導致他們在瀏覽器的實際應用過程中體現出一些不同。
看到這里也就結束了。現在,當其他人再問你 get 和 post 的區別,你終於可以安安穩穩的裝 13 了。
參考
- 99%的人都理解錯了HTTP中GET與POST的區別:https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
- W3School:HTTP 方法:GET 對比 POST:http://www.w3school.com.cn/tags/html_ref_httpmethods.asp