1. 程式人生 > >深度剖析post和get的區別

深度剖析post和get的區別

過濾 出了 打開 資源 優點 基本 禁止 自己的 rest

剛步入前端的你 學習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的區別