HTTP協議中GET、POST和HEAD的介紹

HTTP協議中GET、POST和HEAD的介紹
GET: 請求指定的頁面信息,並返回實體主體。
HEAD: 只請求頁面的首部。
POST: 請求服務器接受所指定的文檔作爲對所標識的URI的新的從屬實體。可以請求很多資源。


post:創建一個新的資源
put:更新一個已存在的資源
get:獲取一個已經存在的資源
delete:刪除一個已經存在的資源

      
HTTP 定義了與服務器交互的不同方法,最基本的方法是 GET 和 POST。事實上 GET 適用於多數請求,而保留 POST
僅用於更新站點。根據 HTTP 規範,GET 用於信息獲取,而且應該是
安全的和冪等的。所謂安全的意味着該操作用於獲取信息而非修改信息。換句話說,GET 請求一般不應產生副作用。冪等的意味着對同一 URL
的多個請求應該返回同樣的結果。完整的定義並不像看起來那樣嚴格。從根本上講,其目標是當用戶打開一個鏈接時,她可以確信從自身的角度來看沒有改變資源。
比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認爲是安全的和冪等的,因爲它總是返回當前的新聞。反之亦然。POST
請求就不那麼輕鬆了。POST 表示可能改變服務器上的資源的請求。仍然以新聞站點爲例,讀者對文章的註解應該通過 POST
請求實現,因爲在註解提交之後站點已經不同了(比方說文章下面出現一條註解);
在FORM提交的時候,如果不指定Method,則默認爲GET請 求,Form中提交的數據將會附加在url之後,以?分開與url分開。字母數字字符原樣發送,但空格轉換爲“+“號,
[url=javascript:;]其它[/url]
符號轉換爲%XX,其中XX爲 該符號以16進製表示的ASCII(或ISO Latin-1)值。GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中;
GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。  
在表單裏使用”post”和”get”有什麼區別
在Form裏面,可以使用post也可以使用get。它們都是method的合法取值。但是,post和get方法在使用上至少有兩點不同:
1、Get方法通過URL請求來傳遞用戶的輸入。Post方法通過另外的形式。
2、Get方式的提交你需要用Request.QueryString來取得變量的值,而Post方式提交時,你必須通過Request.Form來訪問提交的內容。
仔細研究下面的代碼。你可以運行之來感受一下:
代碼
““ Then %>
通過get方法傳遞來的字符串是: ““
““ Then %>
通過Post方法傳遞來的字符串是: ““
說明
把上面的代碼保存爲getpost.asp,然後運行,首先測試post方法,這時候,瀏覽器的url並沒有什麼變化,返回的結果是:
通過Post方法傳遞來的字符串是: "Hello World"
然後
[url=javascript:;]測試[/url]
用get方法提交,請注意,瀏覽器的url變成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果是:
通過get方法傳遞來的字符串是: "Hello World"
最後再通過post方法提交,瀏覽器的url還是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果變成:
通過get方法傳遞來的字符串是: "Hello World"
通過Post方法傳遞來的字符串是: "Hello World"
提示
通過get方法提交數據,可能會帶來安全性的問題。比如一個登陸頁面。當通過get方法提交數據時,用戶名和密碼將出現在URL上。如果:
1、 登陸頁面可以被瀏覽器緩存;
2、 
[url=javascript:;]其他[/url]
人可以訪問客戶的這臺機器。
那麼,別人即可以從瀏覽器的歷史記錄中,讀取到此客戶的賬號和密碼。所以,在某些情況下,get方法會帶來嚴重的安全性問題。
建議
在Form中,建議使用post方法。
如果用HEAD方法請求的話,則服務器返回的只是響應標題,而不會返回被請求的文擋,HEAD方法通用於一些搜索引擎
--------------------------------------------------------------------------------------------------------------------
GET: 請求指定的頁面信息,並返回實體主體。
HEAD: 只請求頁面的首部。
POST: 請求服務器接受所指定的文檔作爲對所標識的URI的新的從屬實體。
PUT: 從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE: 請求服務器刪除指定的頁面。
OPTIONS: 允許客戶端查看服務器的性能。
TRACE: 請求服務器在響應中的實體主體部分返回所得到的內容。
PATCH: 實體中包含一個表,表中說明與該URI所表示的原內容的區別。
MOVE: 請求服務器將指定的頁面移至另一個網絡地址。
COPY: 請求服務器將指定的頁面拷貝至另一個網絡地址。
LINK: 請求服務器建立鏈接關係。
UNLINK: 斷開鏈接關係。
WRAPPED: 允許客戶端發送經過封裝的請求。
Extension-mothed:在不改動協議的前提下,可增加另外的方法。
比如:
GET /index.html HTTP/1.1
Accept: text/plain /*純ASCII碼文本文件*/
Accept: text/html /*HTML文本文件*/
User-Agent:Mozilla/4.5(WinNT)
說明瀏覽器使用Get方法請求文檔/index.html。瀏覽器則只允許接收純ASCII碼文本文件和HTML文本文件,其使用的引擎是Mozilla/4.5(Netscape)。
當服務器響應時,其狀態行的信息爲HTTP的版本號,狀態碼,及解釋狀態碼的簡單說明。現將5類狀態碼詳細列出:
① 客戶方錯誤
100  繼續
101  交換協議
② 成功
200  OK
201  已創建
202  接收
203  非認證信息
204  無內容
205  重置內容
206  部分內容
③ 重定向
300  多路選擇
301  永久轉移
302  暫時轉移
303  參見其它
304  未修改(Not Modified)
305  使用代理
④ 客戶方錯誤
400  錯誤請求(Bad Request)
401  未認證
402  需要付費
403  禁止(Forbidden)
404  未找到(Not Found)
405  方法不允許
406  不接受
407  需要代理認證
408  請求超時
409  衝突
410  失敗
411  需要長度
412  條件失敗
413  請求實體太大
414  請求URI太長
415  不支持媒體類型
⑤ 服務器錯誤
500  服務器內部錯誤
501  未實現(Not Implemented)
502  網關失敗
504  網關超時
505 HTTP版本不支持
比如:(在《TELNET……》一文中用telnet登陸80端口,相同的方法用在HTTP/1.1中,會發現沒有顯示,下面補充說明之)
telnet
www.fudan.edu.cn
80
HEAD / HTTP/1.1
host:www.fudan.edu.cn /*本行爲輸入內容*/
HTTP/1.1 501 Method Not Implemented
Date: Web, 01 Nov 2000 07:12:29 GMT /*當前的日期/時間*/
Server: Apache/1.3.12 (Unix) /*Web服務器信息*/
Allow: GET, HEAD, OPTION, TRACE /*支持的方法類型*/
Connection: close
Connect-Type: Text/html; charset=iso-8859-1/*連接的媒體類型*/
501 Method
Not Implemented
Method Not Implemented
head to /inde
x.html not supported.
Invalid method in request head / htp/1.1
Apache/1.3.12 Server at
www.fudan.edu.cn
Port 80
關於實體頭部的內容還可以有:
Last Modified :請求文檔的最近修改時間。
Expires :請求文檔的過期時間。
Connect-length:文檔數據的長度。
WWW-authenricate:通知客戶端需要的認證信息。
Connect-encoding :說明有無使用壓縮技術。
Transfer-encoding :說明採用的編碼變換類型。
隨着Internet的發展,下一代的HTTP協議HTTP-ng已經在醞釀之中,它將會提供更好的安全性、更快的速度,其改進要點爲:模塊化強、網絡效率高、
                  Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這 樣認爲:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操作。到這裏,大家應該有個大概的瞭解了,GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。
  1.根據HTTP規範,GET用於信息獲取,而且應該是安全的和冪等的。
  (1).所謂安全的意味着該操作用於獲取信息而非修改信息。換句話說,GET 請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像數據庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。
  * 注意:這裏安全的含義僅僅是指是非修改信息。
  (2).冪等的意味着對同一URL的多個請求應該返回同樣的結果。這裏我再解釋一下冪等這個概念:
複製代碼
  冪等(idempotent、idempotence)是一個數學或計算機學概念,常見於抽象代數中。
  冪等有一下幾種定義:
  對於單目運算,如果一個運算對於在範圍內的所有的一個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那麼我們就稱該運算是冪等的。比如絕對值運算就是一個例子,在實數集中,有abs(a)=abs(abs(a))。
  對於雙目運算,則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函數,有在在實數集中冪等,即max(x,x) = x。
複製代碼
看完上述解釋後,應該可以理解GET冪等的含義了。
  但在實際應用中,以上2條規定並沒有這麼嚴格。引用別人文章的例子:比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操 作仍然被認爲是安全的和冪等的,因爲它總是返回當前的新聞。從根本上說,如果目標是當用戶打開一個鏈接時,他可以確信從自身的角度來看沒有改變資源即可。
  2.根據HTTP規範,POST表示可能修改變服務器上的資源的請求。繼續引用上面的例子:還是新聞以網站爲例,讀者對新聞發表自己的評論應該通過POST實現,因爲在評論提交後站點的資源已經不同了,或者說資源被修改了。
 
  上面大概說了一下HTTP規範中GET和POST的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照HTTP規範去做,導致這個問題的原因有很多,比如說:
  1.很多人貪方便,更新資源時用了GET,因爲用POST必須要到FORM(表單),這樣會麻煩一點。
  2.對資源的增,刪,改,查操作,其實都可以通過GET/POST完成,不需要用到PUT和DELETE。
  3.另外一個是,早期的Web MVC框架設計者們並沒有有意識地將URL當作抽象的資源來看待和設計,所以導致一個比較嚴重的問題是傳統的Web MVC框架基本上都只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE方法。
   * 簡單解釋一下MVC:MVC本來是存在於Desktop程序中的,M是指數據模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式。
  以上3點典型地描述了老一套的風格(沒有嚴格遵守HTTP規範),隨着架構的發展,現在出現REST(Representational State Transfer),一套支持HTTP規範的新風格,這裏不多說了,可以參考《RESTful Web Services》。
 
  說完原理性的問題,我們再從表面現像上面看看GET和POST的區別:
  1.GET請求的數據會附在URL之後(就是 把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,如:login.action?name=hyddd& password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空 格,轉換爲+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以 16進製表示的ASCII。
  POST把提交的數據則放置在是HTTP包的包體中。
  2."GET方式提交的數據最多隻能是1024字節,理論上POST沒有限制,可傳較大量的數據,IIS4中最大爲80KB,IIS5中爲100KB"??!
  以上這句是我從其他文章轉過來的,其實這樣說是錯誤的,不準確的:
  (1).首先是"GET方式提交的數據最多隻能是1024字節",因爲GET是通過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關係了。而實際上,URL不存在參數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。
  注意這是限制是整個URL長度,而不僅僅是你的參數值數據長度。[見參考資料5]
  (2).理論上講,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之前沒有這些限制。[見參考資料5]
  所以上面的80K,100K可能只是默認值而已(注:關於IIS4和IIS5的參數,我還沒有確認),但肯定是可以自己設置的。由於每個版本的IIS對這些參數的默認值都不一樣,具體請參考相關的IIS配置文檔。
  3.在ASP中,服務端獲取GET請求參數用 Request.QueryString,獲取POST請求參數用Request.Form。在JSP中,用 request.getParameter(\"XXXX\")來獲取,雖然jsp中也有request.getQueryString()方法,但使用 起來比較麻煩,比如:傳一個test.jsp?name=hyddd&password=hyddd,用 request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以 用$_GET和$_POST分別獲取GET和POST中的數據,而$_REQUEST則可以獲取GET和POST兩種請求中的數據。值得注意的是,JSP 中使用request和PHP中使用$_REQUEST都會有隱患,這個下次再寫個文章總結。
  4.POST的安全性要比GET的安全性 高。注意:這裏所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作數據修改,而這裏安全的含義是真正的Security 的含義,比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因爲(1)登錄頁面有可能被瀏覽器緩存,(2)其他人查看瀏覽器的歷史紀錄,那麼 別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery***。
  總結一下,Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求,在FORM(表單)中,Method默認爲"GET",實質上,GET和POST只是發送機制不同,並不是一個取一個發!
  純屬hyddd個人總結,如有錯漏請指出。


GET - 從指定的服務器中獲取數據

POST - 提交數據給指定的服務器處理

 

GET方法:

使用GET方法時,查詢字符串(鍵值對)被附加在URL地址後面一起發送到服務器:

/test/demo_form.jsp?name1=value1&name2=value2

特點:

    - GET請求能夠被緩存

    - GET請求會保存在瀏覽器的瀏覽記錄中

    - 以GET請求的URL能夠保存爲瀏覽器書籤

    - GET請求有長度限制

    - GET請求主要用以獲取數據

POST方法:

使用POST方法時,查詢字符串在POST信息中單獨存在,和HTTP請求一起發送到服務器:

POST /test/demo_form.jsp HTTP/1.1

Host: w3schools.com

name1=value1&name2=value2

特點:

    - POST請求不能被緩存下來

    - POST請求不會保存在瀏覽器瀏覽記錄中

    - 以POST請求的URL無法保存爲瀏覽器書籤

    - POST請求沒有長度限制



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章