閱讀rfc文檔后,淺談http協(xié)議中的GET和POST

? ? ? 剛剛開始接觸http協(xié)議的時候是學習javaEE,那時并不懂那么多,反正看著教程怎么用就是。后來為了面試,就去背了一些百度上關(guān)于get和post請求的區(qū)別,大概有5,6點吧。下面貼上一些百度上的對get和post的區(qū)別。

1. get是從服務器上獲取數(shù)據(jù),post是向服務器傳送數(shù)據(jù)。

2. get是把參數(shù)數(shù)據(jù)隊列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內(nèi)各個字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。

3. 對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request.Form獲取提交的數(shù)據(jù)。

4. get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。

5. get安全性非常低,post安全性較高。但是執(zhí)行效率卻比Post方法好。

建議:

1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數(shù)據(jù)提交方式;

2、在做數(shù)據(jù)查詢時,建議用Get方式;而在做數(shù)據(jù)添加、修改或刪除時,建議用Post方式;

這個是在百度上隨手一抓的,對上面的5點,我逐個說明一下。

1. get從服務器獲取數(shù)據(jù),post向服務器傳遞數(shù)據(jù),這個是我們對它們最早的認識,也沒什么好解釋的,就是一種官方的認定吧。

2. 這點似乎是想表達get請求是可以在地址欄看到參數(shù),post請求在地址欄看不到參數(shù)。目的是建議開發(fā)者使用post比get安全一些。其實本質(zhì)上是因為get請求沒有實體傳遞,所以只能在地址欄后面追加參數(shù)。post請求有實體傳遞,參數(shù)可以放進實體中傳到服務器上,當然也可以在地址欄上追加參數(shù)的。

3. 這點不多解釋,每一門語言設(shè)計接收http請求的方式可能不一樣。但是本質(zhì)還是一樣的,怎么傳過來就怎么獲取。

4. 這點我不覺得很多回答者都是在百度上或者是其他人口中聽回來的,我們知道get請求沒有實體傳送,post有實體傳送。所以在參數(shù)大小上,肯定是post方式能裝得多一點。但是這些精確程度,官方文檔是沒有說明的。

5. 這點很好理解嘛。還是它們的區(qū)別,因為get請求只能在地址欄上追加參數(shù),所以很容易被人窺探到。post有實體傳遞,我們在傳遞過程甚至可以為其加密。

這里是rfc文檔對get和post的說明:

8.1? GET

? ? ? GET方法就是以實體方式得到由請求URI所指定資源的信息。如果請求URI只是一個數(shù)據(jù)產(chǎn)生過程,那么最終要在回應實體中返回的是由該處理過程的結(jié)果所指向的資源,而不是返回該處理過程的描述文字,除非那段文字恰好是處理的輸出。

? ? ? 如果請求消息包含If-Modified-Since標題域,GET方法的語法就變成“條件GET”,即“(conditional GET)”。 條件GET方法可以對指定資源進行判斷,如果它在If-Modified-Since標題域(見10.9節(jié))中的指定日期后發(fā)生了更新,才啟動傳輸,否則不傳輸。這種條件GET允許被緩存的實體在不必經(jīng)過多次請求或不必要的數(shù)據(jù)傳輸就能進行刷新,從而有助于降低網(wǎng)絡負載。

8.3? POST

? ? ? POST方法用來向目的服務器發(fā)出請求,要求它接受被附在請求后的實體,并把它當作請求隊列(Request-Line)中請求URI所指定資源的附加新子項。POST被設(shè)計成用統(tǒng)一的方法實現(xiàn)下列功能:

? ? ? o 對現(xiàn)有資源的注釋(Annotation of existing resources);

? ? ? o 向電子公告欄、新聞組,郵件列表或類似討論組發(fā)送消息;

? ? ? o 提交數(shù)據(jù)塊,如將表格(form [3])的結(jié)果提交給數(shù)據(jù)處理過程;

? ? ? o 通過附加操作來擴展數(shù)據(jù)庫。

? ? ? POST方法的實際功能由服務器來決定,而且通常依賴于請求URI。在POST過程中,實體是URI的從屬部分,就好象文件從屬于包含它的目錄、新聞組文件從屬于發(fā)出該文件的新聞組、記錄從屬于其所在的數(shù)據(jù)庫一樣。

? ? ? 成功的POST不需要在原始服務器創(chuàng)建實體,并將其做為資源;也不需要為未來的訪問提供條件。也就是說,POST方法不一定會指向URI指定的資源。在這種情況下,200(成功)或204(無內(nèi)容)都是適當?shù)幕貞獱顟B(tài),取決于實際回應實體中對結(jié)果的描述。

? ? ? 如果在原始服務器上創(chuàng)建了資源,回應應是201(已創(chuàng)建),并包含一個實體(對"text/html"類型最為適合),該實體中記錄著對新資源請求的狀態(tài)描述。

? ? ? 在所有的HTTP/1.0的POST請求中,必須指定合法的內(nèi)容長度(Content-Length)。如果HTTP/1.0服務器在接收到請求消息內(nèi)容時無法確定其長度,就會返回400(非法請求)代碼。

? ? ? 應用程序不能緩存對POST請求的回應,因為做為應用程序來說,它們沒有辦法知道服務器在未來的請求中將如何回應。

個人總結(jié)

? ? ? 在rfc文檔上的說法是標準,get是用來獲取實體的,post是用來傳遞實體的。但是在開發(fā)中,由于不遵守官方標準,才會得出很多經(jīng)驗(甚至是錯誤的)。個人建議,無論什么知識都要官方文檔中學習。在上面的標準才是最有權(quán)威性的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容