首先,get和post並沒有本質上的區別,都只是 HTTP 協議中兩種請求方式,用的都是同一個傳輸層協議,在傳輸上並沒有什么不同。
1.get和post報文上的區別
GET 和 POST 只是 HTTP 協議中兩種請求方式,而 HTTP 協議是基於 TCP/IP 的應用層協議,無論 GET 還是 POST,用的都是同一個傳輸層協議,所以在傳輸上,沒有區別。
報文格式上,不帶參數時,最大區別就是第一行方法名不同
POST方法請求報文第一行是這樣的 POST /uri HTTP/1.1 \r\n
GET方法請求報文第一行是這樣的 GET /uri HTTP/1.1 \r\n
帶參數時報文的區別是GET 方法的參數應該放在 url 中,POST 方法參數應該放在 body 中
get方法簡約版報文:
GET /index.php?name=xiaoming.c&age=3 HTTP/1.1
Host:
localhost
post方法簡約版報文:
POST /index.php HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencode
name=qiming.c&age=22
2. GET方法 和 POST 方法安全性上差異
按照網上大部分文章的解釋,POST 比 GET 安全,因為數據在地址欄上不可見
然而,從傳輸的角度來說,他們都是不安全的,因為 HTTP 在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文。
要想安全傳輸,就只有加密,也就是 HTTPS。
3. GET 方法有長度限制 ?最多為1024kb?
GET方法提交的url參數數據大小沒有限制
HTTP 協議沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器和服務器的原因。
瀏覽器原因是因為瀏覽器廠商的設定,服務器是因為處理長 URL 要消耗比較多的資源,為了性能和安全(防止惡意構造長 URL 來攻擊)考慮,會給 URL 長度加限制。
4. POST 方法產生兩個數據包?
有些觀點中提到,post 會將 header 和 body 分開發送,先發送 header,服務端返回 100 狀態碼再發送 body。
HTTP 協議中沒有明確說明 POST 會產生兩個 TCP 數據包,而且實際測試(Chrome)發現,header 和 body 不會分開發送。
所以,header 和 body 分開發送是部分瀏覽器或框架的請求方法,不屬於 post 必然行為。
5. “get常用於獲取數據,post用於提交數據”
雖然get的確常被用於獲取數據,但post也可以在一些UI框架被用於取回數據
get和post用途也是因地制宜,要根據實際情況來決定用哪個方法。