首先,GET和POST是HTTP請求的兩種基本方法~
“江湖上”流傳的GET和POST區別
1、GET提交的數據會放在URL之后,以 ?分割URL和傳輸數據,參數之間用 & 相連,如 EditPosts.aspx?name=boKeYuan&id=123456;POST方法是把提交的數據放在HTTP包的Body中
2、GET提交的數據大小有限制(注意:Http Get方法提交的數據大小長度並沒有限制,HTTP協議規范沒有對URL長度進行限制,這個限制是特定的瀏覽器及服務器對它的限制);POST方法提交的數據沒有限制
3、對參數的數據類型,GET只接受ASCII字符;而POST沒有限制
4、GET請求參數會被完整保留在瀏覽器歷史記錄里;而POST中的參數不會被保留
5、GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息
HTTP
1、HTTP是是基於TCP/IP協議族的關於數據如何在萬維網中通信的協議。HTTP定義了很多與服務器交互得方法,最基本的有四種:GET、POST、PUT、DELETE,這四個方法對應着對請求資源的查、改、增、刪 4個操作。本篇文章只介紹GET和POST。
2、HTTP的底層是TCP/IP,所以GET和POST底層也是TCP/IP。封裝好的HTTP報文是要交給TCP去處理的。
TCP
1、TCP是運輸層的協議,將應用層傳過來的HTTP報文分割成報文段,傳送給通信的對方,TCP是可靠交付,能夠保證數據完整的傳達給對方。
2、在整個萬維網世界中,會有無數個TCP連接,怎么區分這些TCP連接呢?這就要用到協議規范HTTP了,HTTP指明每一個TCP連接是POST或者GET。
HTTP只是個行為准則,而TCP才是POST和GET怎么實現的基本。
瀏覽器和服務器
1、TCP在瀏覽器和服務器之間建立連接,並且在兩者之間按照客戶需求傳輸信息(數據)。如果傳輸的信息過大,對於瀏覽器和服務器來說都是很大的負擔,大多數瀏覽器都會限制 URL 在2K個字節,而大多數服務器最多處理64K大小的 URL。超出的部分,直接丟棄~
2、上面提到過,GET方法的數據是放在 URL 中的,如果你在 request body 中偷偷藏了數據,不同的服務器處理方式也是不同的,有的會“好心”讀出,有的則“視而不見”~
3、說到這里,你應該明白了,GET和POST本質上就是TCP連接。
GET和POST的根本區別
GET產生一個數據包,POST產生兩個數據包
多數瀏覽器(Firefox就只發送一次)對於POST采用兩階段發送數據:先發送請求頭(header數據),再發送請求體(body部分)。這會導致在傳輸層中出現兩次TCP連接,對於TCP來說,通信次數越多可靠性越低,能在一次連接中傳輸完需要的消息是最可靠的。
而GET方法只需要建立一次連接就能發送所有數據了。
使用情況
POST和GET各有自己的優缺點,根據需求來選擇使用GET或POST。
1、比如有人這樣問,POST需要兩步,時間上消耗的更多,能否用GET來替換POST?
顯然不能
- GET與POST都有自己的語義,不能隨便混用
- 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點
並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次
2、GET不安全,能否全部用POST?
顯然也不能
- 對數據請求頻繁,數據不敏感且數據量在普通瀏覽器最小限定的2k范圍內,這樣的情況最適合使用GET