99%的人理解錯HTTP中GET與POST的區(qū)別
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
GET 和 POST 是 HTTP 請求的兩種基本方法,要說它們的區(qū)別,接觸過 WEB 開發(fā)的人都能說出一二。 最直觀的區(qū)別就是 GET 把參數(shù)包含在 URL 中,POST 通過 request body 傳遞參數(shù)。 你可能自己寫過無數(shù)個 GET 和 POST 請求,或者已經看過很多權威網站總結出的他們的區(qū)別,你非常清楚知道什么時候該用什么。 當你在面試中被問到這個問題,你的內心充滿了自信和喜悅。 你輕輕松松的給出了一個"標準答案": GET 在瀏覽器回退時是無害的,而 POST 會再次提交請求。 GET 產生的 URL 地址可以被 Bookmark,而 POST 不可以。 GET 請求會被瀏覽器主動 cache,而 POST 不會,除非手動設置。 GET 請求只能進行 url 編碼,而 POST 支持多種編碼方式。 GET 請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而 POST 中的參數(shù)不會被保留。 GET 請求在 URL 中傳送的參數(shù)是有長度限制的,而 POST 么有。 對參數(shù)的數(shù)據(jù)類型,GET 只接受 ASCII 字符,而 POST 沒有限制。 GET 比 POST 更不安全,因為參數(shù)直接暴露在 URL 上,所以不能用來傳遞敏感信息。 GET 參數(shù)通過 URL 傳遞,POST 放在 Request body 中。 (本標準答案參考自 w3schools) "很遺憾,這不是我們要的回答!" 請告訴我真相。。。 如果我告訴你 GET 和 POST 本質上沒有區(qū)別你信嗎? 讓我們扒下 GET 和 POST 的外衣,坦誠相見吧! GET 和 POST 是什么?HTTP 協(xié)議中的兩種發(fā)送請求的方法。 HTTP 是什么?HTTP 是基于 TCP/IP 的關于數(shù)據(jù)如何在萬維網中如何通信的協(xié)議。 HTTP 的底層是 TCP/IP。所以 GET 和 POST 的底層也是 TCP/IP,也就是說,GET/POST 都是 TCP 鏈接。GET 和 POST 能做的事情是一樣一樣的。你要給 GET 加上 request body,給 POST 帶上 url 參數(shù),技術上是完全行的通的。 那么,"標準答案"里的那些區(qū)別是怎么回事? 在我大萬維網世界中,TCP 就像汽車,我們用 TCP 來運輸數(shù)據(jù),它很可靠,從來不會發(fā)生丟件少件的現(xiàn)象。但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統(tǒng)一定會癱瘓。為了避免這種情況發(fā)生,交通規(guī)則 HTTP 誕生了。HTTP 給汽車運輸設定了好幾個服務類別,有 GET, POST, PUT, delete 等等,HTTP 規(guī)定,當執(zhí)行 GET 請求的時候,要給汽車貼上 GET 的標簽(設置 method 為 GET),而且要求把傳送的數(shù)據(jù)放在車頂上(url 中)以方便記錄。如果是 POST 請求,就要在車上貼上 POST 的標簽,并把貨物放在車廂里。當然,你也可以在 GET 的時候往車廂內偷偷藏點貨物,但是這是很不光彩;也可以在 POST 的時候在車頂上也放一些數(shù)據(jù),讓人覺得傻乎乎的。HTTP 只是個行為準則,而 TCP 才是 GET 和 POST 怎么實現(xiàn)的基本。 但是,我們只看到 HTTP 對 GET 和 POST 參數(shù)的傳送渠道(url 還是 requrest body)提出了要求。"標準答案"里關于參數(shù)大小的限制又是從哪來的呢? 在我大萬維網世界中,還有另一個重要的角色:運輸公司。不同的瀏覽器(發(fā)起 http 請求)和服務器(接受 http 請求)就是不同的運輸公司。雖然理論上,你可以在車頂上無限的堆貨物(url 中無限加參數(shù))。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數(shù)據(jù)量太大對瀏覽器和服務器都是很大負擔。業(yè)界不成文的規(guī)定是,(大多數(shù))瀏覽器通常都會限制 url 長度在 2K 個字節(jié),而(大多數(shù))服務器最多處理 64K 大小的 url。超過的部分,恕不處理。如果你用 GET 服務,在 request body 偷偷藏了數(shù)據(jù),不同服務器的處理方式也是不同的,有些服務器會幫你卸貨,讀出數(shù)據(jù),有些服務器直接忽略,所以,雖然 GET 可以帶 request body,也不能保證一定能被接收到哦。 好了,現(xiàn)在你知道,GET 和 POST 本質上就是 TCP 鏈接,并無差別。但是由于 HTTP 的規(guī)定和瀏覽器 / 服務器的限制,導致他們在應用過程中體現(xiàn)出一些不同。 你以為本文就這么結束了? 我們的大 BOSS 還等著出場呢。。。 這位 BOSS 有多神秘?當你試圖在網上找" GET 和 POST 的區(qū)別"的時候,那些你會看到的搜索結果里,從沒有提到他。他究竟是什么呢。。。 GET 和 POST 還有一個重大區(qū)別,簡單的說: GET 產生一個 TCP 數(shù)據(jù)包;POST 產生兩個 TCP 數(shù)據(jù)包。 長的說: 對于 GET 方式的請求,瀏覽器會把 http header 和 data 一并發(fā)送出去,服務器響應 200(返回數(shù)據(jù)); 而對于 POST,瀏覽器先發(fā)送 header,服務器響應 100 continue,瀏覽器再發(fā)送 data,服務器響應 200 ok(返回數(shù)據(jù))。 也就是說,GET 只需要汽車跑一趟就把貨送到了,而 POST 得跑兩趟,第一趟,先去和服務器打個招呼"嗨,我等下要送一批貨來,你們打開門迎接我",然后再回頭把貨送過去。 因為 POST 需要兩步,時間上消耗的要多一點,看起來 GET 比 POST 更有效。因此 Yahoo 團隊有推薦用 GET 替換 POST 來優(yōu)化網站性能。但這是一個坑!跳入需謹慎。為什么? 1. GET 與 POST 都有自己的語義,不能隨便混用。 2. 據(jù)研究,在網絡環(huán)境好的情況下,發(fā)一次包的時間和發(fā)兩次包的時間差別基本可以無視。而在網絡環(huán)境差的情況下,兩次包的 TCP 在驗證數(shù)據(jù)包完整性上,有非常大的優(yōu)點。 3. 并不是所有瀏覽器都會在 POST 中發(fā)送兩次包,F(xiàn)irefox 就只發(fā)送一次。 現(xiàn)在,當面試官再問你" GET 與 POST 的區(qū)別"的時候,你的內心是不是這樣的? 該文章在 2023/11/10 12:16:05 編輯過 |
關鍵字查詢
相關文章
正在查詢... |