深度剖析post和get的區別
剛步入前端的你 學習html和css表單 你可能就會聽到post和get的區別。那麽究竟get和post有什麽樣的區別呢?
1、get是從服務器上獲取數據;而post是向服務器發送數據;
2、get傳送數據量較小,不能大於2kb;而post傳送量大,不受限制;
3、get安全性非常低,post安全性較高,但執行效率比post好;
4、get是把參數數據隊列加到提交表單的Action屬性,所指的url中在url中可以看到;而post通過HTTP post機制,放在body裏 用戶看不到;
僅僅只有這些嗎?NO NO NO!知道這些還遠遠不夠,那麽get和post究竟還有什麽區別呢?
其實get和post本質上沒有區別,他們都是http協議中請求的方法,底層的實現都是基於TCP/IP,上述的所謂區別,只是瀏覽器廠家根據約定,做得限制而已。
http請求最初設定了8種方法,這8種方法本質沒有區別,只是讓請求更加有語義而已。
1、options 返回服務器所支持的請求方法
2、get向服務器獲取指定資源
3、head和get一致,只不過響應體不返回,只返回響應頭
4、post向服務器提交數據,數據放在請求體裏
5、put和post相似,只是添加了冪屬性,常用於更新
6、delete用於刪除服務器指定資源
7、trace 回顯服務器端收到的請求,測試的時候一般會用到這個
8、connect預留,暫無使用
Restful API:
服務端根據不同的請求方式,可以做不同的處理,同時,根據不同的請求,還可以設計出不同風格的應用程序接口,這就引出了Representational State Transfer,英文縮寫就是REST,中文意思是表述性狀態轉移(和沒翻譯差不多),可以理解為客戶端和服務端的交互形式。而符合這種交互形式的接口設計,就被叫做RESTful API。這種風格有如下特點:
1、使用名詞而不使用動詞
例如:/getStudent 或者 /searchStudents 應該改成 /students
2、GET用於查詢,PUT、POST、DELETE用於修改
使用名詞復數不使用單數
在HTTP請求的head體裏定義序列化類型
例如:Content-Type:application/json
請求的集合應設定好過濾條件、排序、字段、分頁
例如:/students?page=1&size=10
接口要版本化
例如:/api/v1/students
要有HTTP狀態碼
允許重寫HTTP請求方法
HTTP狀態碼
HTTP協議中提供了好多狀態碼,列舉我們常用的:
200 返回正常
304 服務端資源無變化,可使用緩存資源
400 請求參數不合法
401 未認證
403 服務端禁止訪問該資源
404 服務端未找到該資源
500 服務端異常
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就只發送一次。
深度剖析post和get的區別