前言
這個問題看上去特別初級,但實際上卻涉及到方方面面,也是面試官特別喜歡考的原因之一。既然如此,那就讓我們來一起徹底理清楚他們的區別。
首先,我們先科普一些知識點。
什麼是 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 請求
- 它是
HTTP
常見的請求型別,最常見於向伺服器查詢某些資訊。 - 可以將查詢引數追加到
URL
末尾,以便將資訊傳送給伺服器。 - 對查詢字串的格式有要求,每個引數名稱和值必須使用
encodeURIComponent
進行編碼,才能放到URL
末尾,必須用&
符號隔開。例如:baidu.com/index.php?name=111&id=222 - GET請求產生一個資料包。對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料)
POST請求
- 它是
HTTP
常見的請求型別,最常見於向伺服器傳送應該被儲存的資訊或者查詢某些資訊。 - 可以新增請求引數,將請求引數新增到body中。
POST
請求產生2個資料包,在火狐瀏覽器中,產生一個資料包。
GET請求和POST請求的差別
GET
請求的請求引數是新增到head
中,可以在url
中可以看到;POST
請求的請求引數是新增到BODY
中,在url
中不可見。GET
請求引數需要使用encodeURIComponent
進行編碼,必須用&
符號隔開。- 請求的
url
有長度限制,這個限制由瀏覽器和web
伺服器決定和設定的。例如IE瀏覽器對URL
的最大限制為2083個字元,如果超過這個數字,提交按鈕沒有任何反應。因為GET
請求的引數是新增到URL
中,所以GET
請求的URL
的長度限制需要將請求引數長度也考慮進去。而POST
請求不用考慮請求引數的長度。 GET
請求產生一個資料包;POST
請求產生2個資料包,在火狐瀏覽器中,產生一個資料包。這個區別點在於瀏覽器的請求機制,先傳送請求頭,再傳送請求體。因為GET
沒有請求體,所以就傳送一個資料包,而POST
包含請求體,所以傳送兩次資料包,但是由於火狐機制不同,所以傳送一個資料包。- 由於
GET
請求的引數是在url
中,所以可以直接在瀏覽器中開啟 GET
請求會被瀏覽器主動快取下來,留下歷史記錄,而POST
預設不會。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.博主認為這並不是一個很大的區別點,理由如上,所以並未涉及。