都2020年了,還理不清GET請求和POST請求區別?

LemonYu發表於2020-03-19

前言

這個問題看上去特別初級,但實際上卻涉及到方方面面,也是面試官特別喜歡考的原因之一。既然如此,那就讓我們來一起徹底理清楚他們的區別。

首先,我們先科普一些知識點。

什麼是 HTTP

HTTP 超文字傳輸協議,是一個簡單的請求-響應協議,它通常執行在 TCP 之上。它指定了客戶端可能傳送給伺服器什麼樣的訊息以及得到什麼樣的響應。

HTTP請求方法

序號 方法 描述
01 HEAD 請求指定的頁面資訊,並返回實體主體。
02 GET 類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
03 POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST 請求可能會導致新的資源的建立或已有資源的修改。
04 PUT 從客戶端向伺服器傳送的資料取代指定的文件的內容。
05 DELETE 請求伺服器刪除指定的頁面。
06 CONNECT HTTP/1.1 協議中預留給能夠將連線改為管道方式的代理伺服器。
07 OPTIONS 允許客戶端檢視伺服器的效能。
08 TRACE 回顯伺服器收到的請求,主要用於測試或診斷。
09 PATCH 是對 PUT 方法的補充,用來對已知資源進行區域性更新。

知識已經科普的差不多了,接下來,讓我們一起分析 GET 請求把。

GET 請求

  1. 它是 HTTP 常見的請求型別,最常見於向伺服器查詢某些資訊。
  2. 可以將查詢引數追加到 URL末尾,以便將資訊傳送給伺服器。
  3. 對查詢字串的格式有要求,每個引數名稱和值必須使用encodeURIComponent進行編碼,才能放到URL末尾,必須用&符號隔開。例如:baidu.com/index.php?name=111&id=222
  4. GET請求產生一個資料包。對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料)

POST請求

  1. 它是 HTTP 常見的請求型別,最常見於向伺服器傳送應該被儲存的資訊或者查詢某些資訊。
  2. 可以新增請求引數,將請求引數新增到body中。
  3. POST請求產生2個資料包,在火狐瀏覽器中,產生一個資料包。

GET請求和POST請求的差別

  1. GET 請求的請求引數是新增到 head 中,可以在 url 中可以看到;POST 請求的請求引數是新增到BODY中,在url 中不可見。
  2. GET 請求引數需要使用 encodeURIComponent 進行編碼,必須用 & 符號隔開。
  3. 請求的url有長度限制,這個限制由瀏覽器和 web 伺服器決定和設定的。例如IE瀏覽器對 URL的最大限制為2083個字元,如果超過這個數字,提交按鈕沒有任何反應。因為GET請求的引數是新增到URL中,所以GET請求的URL的長度限制需要將請求引數長度也考慮進去。而POST請求不用考慮請求引數的長度。
  4. GET請求產生一個資料包; POST請求產生2個資料包,在火狐瀏覽器中,產生一個資料包。這個區別點在於瀏覽器的請求機制,先傳送請求頭,再傳送請求體。因為GET沒有請求體,所以就傳送一個資料包,而POST包含請求體,所以傳送兩次資料包,但是由於火狐機制不同,所以傳送一個資料包。
  5. 由於GET請求的引數是在url中,所以可以直接在瀏覽器中開啟
  6. GET 請求會被瀏覽器主動快取下來,留下歷史記錄,而 POST 預設不會。
  7. GET是冪等的,而POST不是。(冪等表示執行相同的操作,結果也是相同的)

GET請求和POST請求的使用場景

如果想要查詢的更快,可以使用GET請求。 其他的,並無差別。

留言解惑

由於有些小夥伴給我留言,說部分內容存在差異,這邊統一說明下。

  • 問題1:GET 請求可以支援 BODY 傳遞請求引數的。博主卻沒有提及。

解答:
1.GET 請求,預設是不支援BODY傳遞請求引數的。
2.你可以通過其他方式讓其支援BODY傳遞請求引數, 但是官方並不建議這樣做。
3.畢竟這不是一個規範,也會存在未知的相容性問題。所以我並未強調這一點,畢竟存在相容性問題,而且還需要大量力氣去開發,如果只是為BODY傳遞請求引數,為什麼不直接用POST請求呢,POST請求它不香嗎?

  • 問題2:GET請求、POST請求還涉及是否可以被收藏書籤耶~博主沒有提及。

解答:
1.GET請求和POST請求都可以被設定為書籤的,當存在請求引數時,POST請求無法在書籤中體現請求引數後的結果。因為POST的請求引數在BODY中。
2.在實際專案開發中,大部分介面都是需要驗證身份資訊的。這個時候新增書籤的意義就不是很大。因為資訊都會獲取不到。
3.博主認為這並不是一個很大的區別點,理由如上,所以並未涉及。

相關文章