http 請求 get 和 post 的區別


GET 和 POST,兩者是 HTTP 協議中發送請求的方法

GET

GET 方法請求一個指定資源的表示形式,使用 GET 的請求應該只被用於獲取數據

POST

POST 方法用於將實體提交到指定的資源,通常導致在服務器上的狀態變化或「副作用」

其本質上都是 TCP 鏈接,並無差別

但是由於 HTTP 的規定和瀏覽器/服務器的限制,導致他們在應用過程中會體現出一些區別

區別

從 w3schools 得到的標准答案的區別如下:

  • 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 中

1. 參數位置

  • 貌似從上面看到 GET 與 POST 請求區別非常大,但兩者實質並沒有區別

  • 無論 GET 還是 POST,用的都是同一個傳輸層協議,所以在傳輸上沒有區別

  • 當不攜帶參數的時候,兩者最大的區別為第一行方法名不同

POST /uri HTTP/1.1 \r\n

GET /uri HTTP/1.1 \r\n
  • 當攜帶參數的時候,我們都知道 GET 請求是放在 url 中,POST 則放在 body 中 GET 方法簡約版報文是這樣的
GET /index.html?name=qiming.c&age=22 HTTP/1.1
Host: localhost
  • POST 方法簡約版報文是這樣的
POST /index.html HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

name=qiming.c&age=22

注意:這里只是約定,並不屬於 HTTP 規范,相反的,我們可以在 POST 請求中 url 中寫入參數,或者 GET 請求中的 body 攜帶參數

2. 參數長度

  • HTTP 協議沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器和服務器的原因
  • IE 對 URL 長度的限制是 2083 字節(2K+35)。對於其他瀏覽器,如 Netscape、FireFox 等,理論上沒有長度限制,其限制取決於操作系統的支持
  • 這里限制的是整個 URL 長度,而不僅僅是參數值的長度
  • 服務器處理長 URL 要消耗比較多的資源,為了性能和安全考慮,會給 URL 長度加限制

3. 安全

  • POST 比 GET 安全,因為數據在地址欄上不可見
  • 然而,從傳輸的角度來說,他們都是不安全的,因為 HTTP 在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文
  • 只有使用 HTTPS 才能加密安全

4. 數據包

  • 對於 GET 方式的請求,瀏覽器會把 http header 和 data 一並發送出去,服務器響應 200(返回數據)
  • 對於 POST,瀏覽器先發送 header,服務器響應 100 continue,瀏覽器再發送 data,服務器響應 200 ok

注意:並不是所有瀏覽器都會在 POST 中發送兩次包,Firefox 就只發送一次

轉自 微信公眾號:JS每日一題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM