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每日一題