1.根據HTTP規範,GET用於信息獲取,應該是安全和冪等的。
(1).所謂安全性是指操作用於獲取信息而不是修改信息。換句話說,GET請求通常不會產生副作用。也就是說,它只獲取資源信息,就像數據庫查詢壹樣,不會修改或添加數據,也不會影響資源的狀態。
*註:這裏的安全性僅指不可修改的信息。
(2)冪等意味著對同壹URL的多個請求應該返回相同的結果。這裏我再次解釋冪等性的概念:
冪等(Idempotent)是數學或計算機科學中的壹個概念,它經常出現在抽象代數中。
冪等有以下定義:
對於單目運算,如果運算的結果對於範圍內的所有數字都是相同的,那麽我們說該運算是冪等的。例如,絕對值運算就是壹個例子。在實數集中,有ABS(a)= ABS(ABS(a))。
對於雙目運算,要求當參與運算的兩個值相等時,如果運算結果等於參與運算的兩個值,則稱該運算為冪等運算。比如求兩個數最大值的函數在實數集上是冪等的,即max(x,x)= x。
看完上面的解釋,妳應該能理解GET冪等的含義了。
但在實踐中,上述兩項規定並沒有那麽嚴格。引用他人文章的例子:例如,新聞網站的首頁不斷更新。盡管第二個請求將返回不同批次的新聞,但該操作仍然被認為是安全和冪等的,因為它總是返回當前新聞。從根本上說,如果目標是當用戶打開壹個鏈接時,他可以確定他沒有從自己的角度更改資源。
2.根據HTTP規範,POST表示可能修改變更服務器上的資源的請求。繼續引用上面的例子:以新聞網站為例。讀者應該發表他們對新聞的評論,因為在提交評論後,網站的資源已經不同或被修改。
以上大概講了HTTP規範中GET和POST的壹些原則性問題。然而,在實踐中,許多人並沒有遵循HTTP規範。造成這壹問題的原因有很多,例如:
1.很多人貪圖方便,在更新資源時使用GET,因為妳要去表單使用POST,會有點麻煩。
2.添加、刪除、修改和搜索資源實際上可以通過GET/POST來完成,而無需使用PUT和DELETE。
3.另壹方面,早期的Web MVC框架設計者並沒有有意識地將URL作為壹種抽象資源來對待和設計,這導致了壹個嚴重的問題,即傳統的Web MVC框架基本上只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE。
*簡單解釋壹下MVC:MVC最初存在於桌面程序中,其中M是指數據模型,V是指用戶界面,C是控制器。使用MVC的目的是將M和V的實現代碼分開,這樣同壹個程序就可以使用不同的表達形式。
以上三點典型地描述了舊風格(不嚴格遵循HTTP規範)。隨著體系結構的發展,出現了壹種新的REST風格(表述性狀態轉移),它支持HTTP規範。這裏就不多說了。請參考RESTful Web服務。
談完原理後,讓我們從表面上看壹下GET和POST的區別:
1請求的數據。GET將附加在URL上(即數據將放在HTTP協議頭中),這樣?拆分URL並傳輸數據,用&;連接,如login.action?name = hyddd & amp。密碼= idontknow & amp驗證=%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)。對於其他瀏覽器,如網景、火狐等。,沒有理論上的長度限制,其限制取決於操作系統的支持。
請註意,這是對整個URL長度的限制,而不僅僅是參數值數據長度的限制。【參見參考文獻5】
(2)從理論上講,POST沒有大小限制,HTTP協議規範也沒有限制大小。“帖子數據量有大小限制80K/100K”的說法是不準確的,帖子數據沒有大小限制。限制它的是服務器處理程序的處理能力。
對於ASP程序,當請求對象處理每個表單字段時,數據長度限制為100K。但是如果妳用請求。BinaryRead則沒有這樣的限制。
由此延伸,對於IIS 6.0,出於安全原因,微軟增加了限制。我們還需要註意:
1).IIS 6.0默認ASP帖子數據最大為200KB,每個表單字段的限制為100KB。
2).默認情況下,IIS 6.0上傳的文件的最大大小為4MB。
3).IIS 6.0的默認最大請求頭是16KB。
在IIS 6.0之前,沒有這樣的限制。【參見參考文獻5】
所以上面的80K,100K可能只是默認值(註:我還沒有確認IIS4和IIS5的參數),但絕對可以自己設置。由於每個版本的IIS對這些參數都有不同的默認值,請參考相關的IIS配置文檔了解詳細信息。
3.在ASP中,服務器使用請求。QueryString獲取請求參數和請求。獲取POST請求參數的表單。在jsp中,request . getparameter(“XXXX”)用於獲取它。雖然JSP中也有request.getQueryString()的方法,但使用起來很麻煩,例如:傳遞test.jsp?name = hyddd & amp。Password = hyddd,而用request.getQueryString()得到的結果是:name = hydd &;密碼= hyddd。在PHP中,可以使用$_GET和$_POST分別獲取GET和POST中的數據,而$_REQUEST可以獲取GET和POST請求中的數據。值得註意的是,在JSP中使用request和在PHP中使用$_REQUEST都存在隱患。下次我會寫壹篇文章摘要。
4.4的安全性。POST比GET高。註意:這裏提到的安全性與上面GET中提到的“安全性”不是同壹個概念。上述“安全”的含義僅意味著數據不會被修改,但這裏的安全含義是安全的真正含義。例如,如果您通過GET提交數據,您的用戶名和密碼將以明文形式出現在URL上,因為(1)登錄頁面可能會被瀏覽器緩存,以及(2)其他人可以查看瀏覽器的歷史記錄,因此其他人可以獲取您的帳號和密碼。此外,如果妳使用GET提交數據,妳也可能得到它。
綜上所述,Get是向服務器請求數據的請求,而Post是向服務器提交數據的請求。在表單中,Method的默認值為“GET”。本質上GET和POST只是發送機制不同,不是壹個拿壹個送!