post 和 get 有什麼區別

原文地址 https://www.javascriptc.com/2876.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

之前好幾次面試都被問到 post 和 get 有什麼區別,肯定很多同學和我一樣說了一大堆什麼 post 比 get 安全,get 比 post 傳的少亂起八糟這樣的答案,但是面試官就還是不停的問你,還有呢還有呢?當時我就火了還有啥?回來之後上網搜來來回回就那麼幾個答案,今天被我找到了正確的答案,今天分享給大家。

GET 和 POST 是 HTTP 請求的兩種基本方法,要說它們的區別,接觸過 WEB 開發的人都能說出一二。

最直觀的區別就是 GET 把參數包含在 URL 中,POST 通過 request body 傳遞參數。

你可能自己寫過無數個 GET 和 POST 請求,或者已經看過很多權威網站總結出的他們的區別,你非常清楚知道什麼時候該用什麼。

當你在面試中被問到這個問題,你的內心充滿了自信和喜悅。

你輕輕鬆鬆的給出了一個 “標準答案”:

GET 在瀏覽器回退時是無害的,而 POST 會再次提交請求。 GET 產生的 URL 地址可以被 Bookmark,而 POST 不可以。 GET 請求會被瀏覽器主動 cache,而 POST 不會,除非手動設置。 GET 請求只能進行 url 編碼,而 POST 支持多種編碼方式。 GET 請求參數會被完整保留在瀏覽器歷史記錄裏,而 POST 中的參數不會被保留。 GET 請求在 URL 中傳送的參數是有長度限制的,而 POST 麼有。 對參數的數據類型,GET 只接受 ASCII 字符,而 POST 沒有限制。 GET 比 POST 更不安全,因爲參數直接暴露在 URL 上,所以不能用來傳遞敏感信息。 GET 參數通過 URL 傳遞,POST 放在 Request body 中。

“很遺憾,這不是我們要的回答!”

請告訴我真相。。。

如果我告訴你 GET 和 POST 本質上沒有區別你信嗎?

讓我們扒下 GET 和 POST 的外衣,坦誠相見吧!

GET 和 POST 是什麼? HTTP 協議中的兩種發送請求的方法。

HTTP 是什麼? HTTP 是基於 TCP/IP 的關於數據如何在萬維網中如何通信的協議。

HTTP 的底層是 TCP/IP。所以 GET 和 POST 的底層也是 TCP/IP,也就是說,GET/POST 都是 TCP 鏈接。GET 和 POST 能做的事情是一樣一樣的。你要給 GET 加上 request body,給 POST 帶上 url 參數,技術上是完全行的通的。

那麼,“標準答案” 裏的那些區別是怎麼回事?

在我大萬維網世界中,TCP 就像汽車,我們用 TCP 來運輸數據,它很可靠,從來不會發生丟件少件的現象。但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統一定會癱瘓。爲了避免這種情況發生,交通規則 HTTP 誕生了。HTTP 給汽車運輸設定了好幾個服務類別,有 GET, POST, PUT, DELETE 等等,HTTP 規定,當執行 GET 請求的時候,要給汽車貼上 GET 的標籤 (設置 method 爲 GET),而且要求把傳送的數據放在車頂上(url 中) 以方便記錄。如果是 POST 請求,就要在車上貼上 POST 的標籤,並把貨物放在車廂裏。當然,你也可以在 GET 的時候往車廂內偷偷藏點貨物,但是這是很不光彩; 也可以在 POST 的時候在車頂上也放一些數據,讓人覺得傻乎乎的。HTTP 只是個行爲準則,而 TCP 纔是 GET 和 POST 怎麼實現的基本。

但是,我們只看到 HTTP 對 GET 和 POST 參數的傳送渠道 (url 還是 requrest body) 提出了要求。“標準答案”裏關於參數大小的限制又是從哪來的呢?

在我大萬維網世界中,還有另一個重要的角色:運輸公司。不同的瀏覽器 (發起 http 請求) 和服務器 (接受 http 請求) 就是不同的運輸公司。 雖然理論上,你可以在車頂上無限的堆貨物 (url 中無限加參數)。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數據量太大對瀏覽器和服務器都是很大負擔。業界不成文的規定是,(大多數) 瀏覽器通常都會限制 url 長度在 2K 個字節,而 (大多數) 服務器最多處理 64K 大小的 url。超過的部分,恕不處理。如果你用 GET 服務,在 request body 偷偷藏了數據,不同服務器的處理方式也是不同的,有些服務器會幫你卸貨,讀出數據,有些服務器直接忽略,所以,雖然 GET 可以帶 request body,也不能保證一定能被接收到哦。

好了,現在你知道,GET 和 POST 本質上就是 TCP 鏈接,並無差別。但是由於 HTTP 的規定和瀏覽器 / 服務器的限制,導致他們在應用過程中體現出一些不同。

你以爲本文就這麼結束了?

我們的大 BOSS 還等着出場呢。。。

這位 BOSS 有多神祕? 當你試圖在網上找 “GET 和 POST 的區別” 的時候,那些你會看到的搜索結果裏,從沒有提到他。他究竟是什麼呢。。。

GET 和 POST 還有一個重大區別,簡單的說:

GET 產生一個 TCP 數據包; POST 產生兩個 TCP 數據包。

長的說:

對於 GET 方式的請求,瀏覽器會把 http header 和 data 一併發送出去,服務器響應 200(返回數據);

而對於 POST,瀏覽器先發送 header,服務器響應 100 continue,瀏覽器再發送 data,服務器響應 200 ok(返回數據)。

也就是說,GET 只需要汽車跑一趟就把貨送到了,而 POST 得跑兩趟,第一趟,先去和服務器打個招呼 “嗨,我等下要送一批貨來,你們打開門迎接我”,然後再回頭把貨送過去。

因爲 POST 需要兩步,時間上消耗的要多一點,看起來 GET 比 POST 更有效。因此 Yahoo 團隊有推薦用 GET 替換 POST 來優化網站性能。但這是一個坑! 跳入需謹慎。爲什麼?

  1. GET 與 POST 都有自己的語義,不能隨便混用。

  2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的 TCP 在驗證數據包完整性上,有非常大的優點。

  3. 並不是所有瀏覽器都會在 POST 中發送兩次包,Firefox 就只發送一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章