1. 程式人生 > >HTTP協議的幾種請求方法(get/post 差別)17.2.15日更新

HTTP協議的幾種請求方法(get/post 差別)17.2.15日更新

【問題的引入】

以前知道HTTP有GET和POST兩種請求方法,並且都見過,但印象裡兩者差不多,可以混著用。最近要進一步研究這個問題,才發現原來的想法不對。

不對有兩點:1,GET和POST區別很大; 2,HTTP有不止這兩種請求方法。

get和post這是http協議的兩種方法,另外還有head,  delete等 

<!--

Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的

4個操作。

GET=獲取,查詢;PUT=更新

Get是向伺服器發索取資料的一種請求,而Post是向伺服器提交資料的一種請求

-->

這兩種方法有本質的區別,get只有一個流,引數附加在url後,大小個數有嚴格限制且只能是字串。post的引數是通過另外的流傳遞的,不通過url,所以可以很大,也可以傳遞二進位制資料,如檔案的上傳。  

在servlet開發中,以doGet()和doPost()分別處理get和post方法。  

另外還有一個doService(),  它是一個排程方法,當一個請求發生時,首先執行doService(),不管是get還是post。在HttpServlet這個基類中實現了一個角度,首先判斷是請求時get還是post,如果是get就呼叫doGet(),  如果是post就呼叫doPost()。你也可以直接過載doService()方法,這樣你可以不管是get還是post。都會執行這個方法。 

 

---------------------------------------------------------------  
 
1.通過表單提交到的servlet,看form的method是get還是post  
2.通過連結訪問的servlet,doGet  
3.直接在ie位址列中鍵入的servlet地址,doGet  
 
一般只要實現一個doGet,再另外一個doPost裡面呼叫doGet(resq,resp),resq和resd是doPost的引數.  
---------------------------------------------------------------  



【GET和POST的區別】
首先要明白,這兩者區別很大,資料在傳輸和處理的過程也不一樣,程式設計者必須完全明白其區別,才能設計出合理的web程式。以下內容參考了文章GET和POST的本質區別是什麼?

(1)使用範圍的區別:

 使用GET時,form中的資料集(如input框的value)將被編碼到URL中,作為URL的一部分。而使用POST時,form中的資料集則被編碼到http協議的header中,構造成訊息傳送。在使用上,當且僅當請求是冪等(請求任意次都返回同樣的結果)時使用GET,而當請求會改變伺服器資料或狀態時使用POST。當程式設計人員正確的使用GET,POST時,瀏覽器會給出更好的快取配合,使響應速度更快。

<!--原理上,1.根據HTTP規範,GET用於資訊獲取,而且應該是安全的和冪等的

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

  * 注意:這裡安全的含義僅僅是指是非修改資訊。

  (2).冪等的意味著對同一URL的多個請求應該返回同樣的結果。
2.根據HTTP規範,POST表示可能修改變伺服器上的資源的請求。-->

(2)在form提交階段的差別:

form提交的第一步是建立資料集,並根據 ENCTYPE 指定的型別值對資料集進行編碼。 ENCTYPE 有兩個值:multipart/form-data,application/x-www-form-urlencoded(預設值)。form提交的第二步是進行資料傳輸。對於GET方法,資料集使用application/x-www-form-urlencoded編碼;而對於POST方法,資料集的 ENCTYPE 可以指定。

application/x-www-form-urlencoded對form資料集的編碼規則:(1)如果是字母或數字,則直接使用其ascii碼的十六進位制。(2)對於非字母也非數字的字元,則不僅使用其ascii碼的十六進位制,還要在前面加上“%”。比如“\”,它的ascii碼是92,92的十六進位制是5c,所以“\”的urlencoded編碼就是%5c。相應的解碼函式(轉載)如下: