GET方法
1、GET交互方式是從服務器上獲取數據,而並非修改數據,所以GET交互方式是安全的。就像數據庫查詢一樣,從數據庫查詢數據,並不會影響數據庫的數據信息,對數據庫來說,也就是安全的。
2、GET交互方式是冪等的,冪等是一個數學概念,冪等函數就是可以使用相同參數重復執行,並且能獲得相同結果的函數。在GET交互這里就是,對同一個URL的多個請求,得到的結果是相同的。就像數據庫查詢,不同的數據庫連接對同一個數據庫表用相同條件查詢時,得到的結果也是一樣的。
POST方法
1、POST交互是可以修改服務器數據的一種方式,涉及到信息的修改,就會有安全問題。就像數據庫的更新,Update一個數據庫表時,如果條件沒有寫對,就可能把不需要修改的數據給修改了,得到的數據就是錯誤的了。
2、一般的POST交互是必須要用到表單的,但是表單提交的默認方法是GET,如果改為POST方式,就需要修改表單提交時的Method。
GET和POST表現形式區別
GET 方法查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的:
GET /test/demo_form.php?name1=value1&name2=value2 HTTP/1.1
POST 方法查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的:
POST /test/demo_form.php HTTP/1.1 Host: runoob.com name1=value1&name2=value2
|
|
GET |
POST |
| 后退按鈕/刷新 |
無害 |
數據會被重新提交(瀏覽器應該告知用戶數據會被重新提交)。 |
| 書簽 |
可收藏為書簽 |
不可收藏為書簽 |
| 緩存 |
能被緩存 |
不能緩存 |
| 編碼類型 |
application/x-www-form-urlencoded |
application/x-www-form-urlencoded or multipart/form-data。為二進制數據使用多重編碼。 |
| 歷史 |
參數保留在瀏覽器歷史中。 |
參數不會保存在瀏覽器歷史中。 |
| 對數據長度的限制 |
是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符)。 |
無限制。 |
| 對數據類型的限制 |
只允許 ASCII 字符。 |
沒有限制。也允許二進制數據。 |
| 安全性 |
與 POST 相比,GET 的安全性較差,因為所發送的數據是 URL 的一部分。 |
POST 比 GET 更安全,因為參數不會被保存在瀏覽器歷史或 web 服務器日志中。 |
| 可見性 |
數據在 URL 中對所有人都是可見的。 |
數據不會顯示在 URL 中。 |
GET和POST本質區別
GET和POST本質上都是TCP鏈接,能做的事情並無差別。但是由於HTTP的規定和瀏覽器/服務器的限制,導致他們在應用過程中體現出一些不同。
GET和POST還有一個重大區別:
GET產生一個TCP數據包:對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據);
POST產生兩個TCP數據包:對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
因為POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。為什么?
1. GET與POST都有自己的語義,不能隨便混用。
2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
3. 並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。
參考:https://www.cnblogs.com/logsharing/p/8448446.html
