您好,登錄后才能下訂單哦!
GET和POST方法到底有什么區別,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
做為一個Web開發者,你一定知道在客戶端與服務端的交互中,HTTP協議為我們提供了許多方法可供使用,例如最為大家熟知的GET和POST方法,此外還有PUT和DELETE等。
今天我們就來說說最為大家熟悉,也被誤用最多的GET和POST方法,以及GET和POST方法在Tomcat中的處理方式。
HTTP規范定義
GET方法
The GET method means retrieve whatever information(in the form of an entity) is identified by the Request-URI.
POST方法
The POST method is used to request that the origin server accept
the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line.
維基百科定義
GET requests a representation of the specified resource.
POST submits data to be processed (e.g., from an HTML form) to the identified resource.
通過以上的定義說明,我們可以簡要概括下:
GET方法用于獲取資源
POST方法用于保存與更新資源
(圖片取自圖解HTTP一書)
那為什么說這兩個方法被錯用了呢,這里錯用更多的是指GET方法。看維基百科上除定義之外的附加說明
GET
Note that GET should not be used for operations that cause side-effects, such as using it for taking actions in web applications. One reason for this is that
GET may be used arbitrarily by robots or crawlers, which should not need to
consider the side effects that a request should cause.
POST
The data is included in the body of the request. This may result in the creation
of a new resource or the updates of existing resources or both.
也就是說GET方法不應該被用來做能引起服務端副作用的操作。POST主要用于創建或者更新資源信息
此外,關于GET方法還有一個稱呼是冪等(idempotent)方法。
而所謂idempotent,是指無論操作多少次,結果都是一樣的。而POST方法,自然不是冪等的,因為他每次都向服務端提交數據,這也是要特別注意表單重復提交的問題。
但開發中,GET方法卻為開發人員大量的不分情況的使用。像提交數據,獲取信息,刪除等等操作。
而大部分應用服務器和Web Server的實現中,都會提供記錄accesslog的機制。
這個accesslog會記一些什么呢?下面是tomcat中的GET方法的一條訪問記錄,我們發現請求中附加的參數也一同被編碼記錄了下來。
[07/Jan/2016:11:40:50 +0800] "GET /test/servlet?abc=%E4%BD%A0%E5%A5%BD HTTP/1.1" 200 117
而POST方法,log記錄下來的只有請求路徑而已。
[07/Jan/2016:11:09:11 +0800] "POST /test/servlet HTTP/1.1" 200 127
而這些訪問日志在應用中又有可能會提供給第三方的app做統計分析使用,試想,如果如果提交的數據中包含用戶名、密碼之類的關鍵信息,那兩種方式一對比,就知道該用啥了。
對比
GET 請求的一些特點:
GET 請求會有 cache
GET 請求會保留在瀏覽歷史中
GET 請求可以保存到書簽
GET 請求不應用于處理敏感數據
GET 請求有長度限制
GET 請求應該只用于獲取數據
POST 請求的一些特點:
POST 不會有cache
POST 請求不會出現在瀏覽器的瀏覽歷史中
POST 請求不能保存到書簽
POST 也是有長度限制的(不同的Web Server可能實現不同)
參數處理
那在Tomcat中對于這兩種不同的方法中,參數解析是如何處理的呢?依然是我們不變的風格,talk is cheap, 看代碼啦!
protected void parseParameters() {
Parameters parameters = coyoteRequest.getParameters();
parameters.setLimit(getConnector().getMaxParameterCount()); //參數個數也是有限制的,默認是10000
parameters.handleQueryParameters(); //如果使用POST方式提交,這里解析不出數據
if( !getConnector().isParseBodyMethod(getMethod()) ) { //這里判斷方法是否為POST
return; }
String contentType = getContentType();
if ("multipart/form-data".equals(contentType)) {
parseParts(false); //這里處理文件上傳
return; }
if (!("application/x-www-form-urlencoded".equals(contentType))) { //form提交的contentType
return;}
int len = getContentLength();
if (len > 0) {
int maxPostSize = connector.getMaxPostSize();
if ((maxPostSize > 0) && (len > maxPostSize)) {//注意這里對于POST也是有長度限制的,不是一般說的POST不限制,默認是2097152
return; }
if (readPostBody(formData, len) != len) {
return; }
parameters.processParameters(formData, 0, len); //這里的代碼在前面的文章中分析過
} else if ("chunked".equalsIgnoreCase(
coyoteRequest.getHeader("transfer-encoding"))) {
formData = readChunkedPostBody(); }
if (formData != null) {
parameters.processParameters(formData, 0, formData.length);
} } }
上面代碼中,關鍵處理部分加了一些注釋,無關的代碼也都做了刪減。
看完上述內容,你們掌握GET和POST方法到底有什么區別的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。