您當前的位置:首頁 > 北塔知識庫

網管知識:HTTP中Get與Post的區別

時間:2014-08-07

摘要:
GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。 關鍵字:網管知識,HTTP,Get,Post

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

1.根據HTTP規范,GET用于信息獲取,而且應該是安全的和冪等的。

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

* 注意:這里安全的含義僅僅是指是非修改信息。

(2).冪等的意味著對同一URL的多個請求應該返回同樣的結果。這里我再解釋一下冪等這個概念:

看完上述解釋后,應該可以理解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之前沒有這些限制。

所以上面的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只是發送機制不同,并不是一個取一個發!

【推薦閱讀】

IT運維管理專區

IT運維管理者如何在DT時代玩轉數據分析

網絡維護如何防止雷電侵擾?

孫永杰:本土軟件企業的對手不是“老外”

網管軟件專區

本文來自互聯網,僅供參考

北塔軟件BTNM產品 免費試用

相關文章

產品中心
北塔BTSO 智慧運維平臺
新一代運維管理軟件,智能化、自動化成就智慧運維..
北塔BTDO業務保障系統
從網際數據流量角度分析業務、保障業務、守護業務...
EMonitor監控管家
輕量級自動監控管家,服務中小企事業單位...
解決方案
纯银3D投注 澳门玩一张比大小 极速快乐十分开奖查询 捕鱼达人技巧 重庆时时彩2017版本 天津11选5开奖果查询 重庆彩快乐十分走势图 时时彩两面盘高胜率规律 双色球走势图表 五星组选包胆保守倍投 排列五今晚开奖 未来农民该怎样赚钱 买彩票中大奖全是假的 北京快乐8计划软件 黑龙江时时漏洞 广西快3开奖结果遗漏值 快乐10分胆码