1. 程式人生 > >【Web篇02】Get請求和Post請求的區別

【Web篇02】Get請求和Post請求的區別

Web的面試題中經常會出現這麼一道題,請簡述Get請求和Post請求的區別,標準答案如下:

  1. get在瀏覽器回退時是無害的,post會再次提交請求;
  2. get產生的url地址可以被bookmark(加入標籤),post不可以;
  3. get請求只能進行url編碼,post可以進行多種編碼;
  4. get請求引數會被完整保留在瀏覽器歷史記錄中,post不會(無痕瀏覽);
  5. 對引數的資料型別,get只接受ASCII字元,post沒有限制;
  6. Get請求在url中傳遞的引數長度有限制,post沒有;
  7. Get比post更不安全,因為引數直接暴露在url中,不能用來傳遞敏感資訊;
  8. Get引數放在url中,post引數放在request body中;

兩種都是HTTP請求的基本方法,最直觀的區別就是get把引數包含在url中,而post通過request body傳遞引數;
但其實兩者本質上並沒有區別,底層都是TCP/IP,都是TCP型別的連結。

小結:
get和post本質都是TCP連結,只是由於HTTP規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同;get產生一個TCP資料包,post產生兩個TCP資料包。
-> 對於get請求,瀏覽器把http header和data一起傳送出去,伺服器響應200(返回資料);
-> 對於post請求,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200 ok(返回資料)。

這樣看似get比post更有效,但實際上:
(1) get和post有自己的語義,不能隨便混用;
(2) 網路好的時候,發一次包和兩次包時間差別基本無視;而網路差的時候,兩次包的tcp在驗證資料包完整性上,有更大的優點;
(3) 並不是所有瀏覽器都會在post中傳送兩次包,比如火狐瀏覽器就只發送一次。