文章大部門摘自如下** 也有從別處看到的然後自己新增的。一、
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規範中get和post的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照http規範去做,導致這個問題的原因有很多,比如說:
1.很多人貪方便,更新資源時用了get,因為用post必須要到form(表單),這樣會麻煩一點。
2.對資源的增,刪,改,查操作,其實都可以通過get/post完成,不需要用到put和delete。
3
.另外乙個是,早期的web mvc框架設計者們並
沒有有意識地將url當作抽象的資源來看待和設計
,所以導致乙個比較嚴重的問題是傳統的web mvc框架基本上都只支援get和post兩種http方法,而不支援put和delete方法。
二、 說完原理性的問題,我們再從表面現像上面看看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中為100k
以上這句是我從其他文章轉過來的,其實這樣說是錯誤的,不準確的:
(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之前沒有這些限制。
所以上面的80k,100k可能只是預設值而已(注:關於iis4和iis5的引數,我還沒有確認),但肯定是可以自己設定的。由於每個版本的iis對這些引數的預設值都不一樣,具體請參考相關的iis配置文件。
3.在asp中,服務端獲取get請求引數用request.querystring,獲取post請求引數用request.form。在jsp中,用request.getparameter(\"***x\")來獲取,雖然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只是傳送機制不同,並不是乙個取乙個發!
get是把引數資料佇列加到提交表單的action屬性所指的url中,值和表單內各個字段一一對應,在url中可以看到。post是通過http post機制,將表單內各個字段與其內容放置在html body內一起傳送到action屬性所指的url位址。使用者看不到這個過程。對於get方式,伺服器端用request.querystring獲取變數的值,對於post方式,伺服器端用request.form獲取提交的資料。
「陽間話」理解get,post區別
儲存對 的熱愛,並保持懷疑態度 1.post相對於get比較安全,get的資料直接顯示到url,post的所有操作對使用者來說都是不可見的。get是不安全的,因為在傳輸過程,資料被放在請求的url中 2.get傳送的資料量較小 post傳送的資料量較大,一般被預設為不受限制。3.get執行效率卻比p...
INIT WORK的暫時理解
scsih fw event add insert and queue up fw event ioc per adapter object fw event object describing the event context this function will acquire ioc fw ...
區間dp暫時的理解
因為剛剛看了區間dp,所以寫一下對區間dp的理解。例題 51nod 1021 看了一篇部落格,覺得他說得比較容易理解,所以再次重複一遍 假如你是上帝,已經知道了1 n堆石子的最優解,那麼它肯定是由兩個子堆組成的,同理,兩個子堆也分別都有自己的兩個子堆,到最底層肯定是1 n堆石子的自身,那我們回到最初...