你可能輕輕松松的給出了一個“标準答案”:
- GET在浏覽器回退時是無害的,而POST會再次送出請求。
- GET産生的URL位址可以被Bookmark,而POST不可以。
- GET請求會被浏覽器主動cache,而POST不會,除非手動設定。
- GET請求參數會被完整保留在浏覽器曆史記錄裡,而POST中的參數不會被保留。
- GET請求隻能進行url編碼,而POST支援多種編碼方式。
- GET請求在URL中傳送的參數是有長度限制的,而POST麼有。
- 對參數的資料類型,GET隻接受ASCII字元,而POST沒有限制。
- GET比POST更不安全,因為參數直接暴露在URL上,是以不能用來傳遞敏感資訊。
- GET參數通過URL傳遞,POST放在Request body中。
但這些都不是主要的差別。
最直覺的差別就是GET把參數包含在URL中,POST通過request body傳遞參數。
GET和POST本質上就是TCP連結,并無差别。但是由于HTTP的規定和浏覽器/伺服器的限制,導緻他們在應用過程中展現出一些不同。
GET和POST還有一個重大差別,簡單的說:
GET産生一個TCP資料包;POST産生兩個TCP資料包。
總的來說:
對于GET方式的請求,浏覽器會把http header和data一并發送出去,伺服器響應200(傳回資料);
而對于POST,浏覽器先發送header,伺服器響應100 continue,浏覽器再發送data,伺服器響應200 ok(傳回資料)。
也就是說,GET隻需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和伺服器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然後再回頭把貨送過去。
因為POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。是以Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。為什麼?
1. GET與POST都有自己的語義,不能随便混用。
2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差别基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。
3. 并不是所有浏覽器都會在POST中發送兩次包,Firefox就隻發送一次。