1. 程式人生 > >詳談get和post的區別與聯系

詳談get和post的區別與聯系

執行 con Nid yahoo style post 瀏覽器 處理 mar

Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。到這裏,大家應該有個大概的了解了,GET一般用於獲取/查詢資源信息,而POST一般用於提交/更新資源信息。

  • GET - 從指定的資源請求數據。
    • GET 請求可被緩存
    • GET 請求保留在瀏覽器歷史記錄中
    • GET 請求可被收藏為書簽
    • GET 請求不應在處理敏感數據時使用
    • GET 請求有長度限制
    • GET 請求只應當用於取回數據
  • POST - 向指定的資源提交要被處理的數據
    • POST 請求不會被緩存
    • POST 請求不會保留在瀏覽器歷史記錄中
    • POST 不能被收藏為書簽
    • POST 請求對數據長度沒有要求

1,http中,GET用於信息獲取,而且是安全的和具有冪等行的。

(1).所謂安全的意味著該操作用於獲取信息而非修改信息。換句話說,GET 請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像數據庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。

* 註意:這裏安全的含義僅僅是指是get請求不會修改服務器信息

(2).冪等的意味著對同一URL的多個請求應該返回同樣的結果。

2,http中,POST是用於修改服務器上的資源的請求。

再談談兩者的區別.

1.本質

Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求

2.服務器端獲取值的方法

get方式提交的數據,服務器端使用request.QueryString獲取變量的值

post方式提交的數據,服務器端使用request.Form獲取數據

3.安全性

get方式安全性低,post方式較安全。但是post方式執行效率要比get方式差一些。

4.機制

get是把參數數據隊列加到提交表單的action屬性所指的URL中,如:http://www.xxx.com?sessonid=db23434&name=hongten&age=20。在URl中,值和表單南日各個字段一一對應,並且這些在URl中對用戶來說是可見的,即用戶時可以看到的。如:name=hongten。

post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到action屬性所指的URL地址,對於用戶來說,這是透明的。

5.大小

URL不存在參數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。

理論上講,POST是沒有大小限制的,HTTP協議規範也沒有進行大小限制,說“POST數據量存在80K/100K的大小限制”是不準確的,POST數據是沒有限制的,起限制作用的是服務器的處理程序的處理能力。

對於ASP程序,Request對象處理每個表單域時存在100K的數據長度限制。但如果使用Request.BinaryRead則沒有這個限制。

由這個延伸出去,對於IIS 6.0,微軟出於安全考慮,加大了限制。我們還需要註意:

1).IIS 6.0默認ASP POST數據量最大為200KB,每個表單域限制是100KB。
2).IIS 6.0默認上傳文件的最大大小是4MB。
3).IIS 6.0默認最大請求頭是16KB。
IIS 6.0之前沒有這些限制。

GET和POST本質上就是TCP鏈接,並無差別。但是由於HTTP的規定和瀏覽器/服務器的限制,導致他們在應用過程中體現出一些不同。

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就只發送一次。

建議:

1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;

2、在做數據查詢時,建議用Get方式;而在做數據添加、修改或刪除時,建議用Post方式;

案例:一般情況下,登錄的時候都是用的POST傳輸,涉及到密碼傳輸,而頁面查詢的時候,如文章id查詢文章,用get 地址欄的鏈接為:article.php?id=11,用post查詢地址欄鏈接為:article.php, 不會將傳輸的數據展現出來。

擴展~

  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。

  • GET產生的URL地址可以被Bookmark,而POST不可以。

  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。

  • GET請求只能進行url編碼,而POST支持多種編碼方式。

  • GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。

  • GET請求在URL中傳送的參數是有長度限制的,而POST麽有。

  • 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。

  • GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。

  • GET參數通過URL傳遞,POST放在Request body中。

http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

詳談get和post的區別與聯系