序言
現(xiàn)在項(xiàng)目中常用的請(qǐng)求要么是GET
,要么是POST
請(qǐng)求,所以搞清楚兩者的區(qū)別顯的至關(guān)重要斥季,也是面試常考的題累驮。
GET請(qǐng)求
POST請(qǐng)求
一 提交數(shù)據(jù)位置
GET提交
請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中)酣倾,以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接谤专;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD躁锡。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送置侍,如果是空格映之,轉(zhuǎn)換為+,如果是中文/其他字符蜡坊,則直接把字符串用BASE64加密惕医,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII算色。
POST提交
把提交的數(shù)據(jù)放置在是HTTP包的包體中。
因此螟够,GET提交的數(shù)據(jù)會(huì)在地址欄中顯示出來灾梦,而POST提交,地址欄不會(huì)改變
二 傳輸數(shù)據(jù)的大小
首先聲明:HTTP協(xié)議沒有對(duì)傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制妓笙,HTTP協(xié)議規(guī)范也沒有對(duì)URL長(zhǎng)度進(jìn)行限制若河。
GET
特定瀏覽器和服務(wù)器對(duì)URL長(zhǎng)度有限制,例如 IE對(duì)URL長(zhǎng)度的限制是2083字節(jié)(2K+35)寞宫。對(duì)于其他瀏覽器萧福,如Netscape、FireFox等辈赋,理論上沒有長(zhǎng)度限制鲫忍,其限制取決于操作系 統(tǒng)的支持。
因此對(duì)于GET提交時(shí)钥屈,傳輸數(shù)據(jù)就會(huì)受到URL長(zhǎng)度的 限制悟民。
POST
由于不是通過URL傳值,理論上數(shù)據(jù)不受 限篷就。但實(shí)際各個(gè)WEB服務(wù)器會(huì)規(guī)定對(duì)post提交數(shù)據(jù)大小進(jìn)行限制射亏,Apache、IIS6都有各自的配置。
三 安全性
POST的安全性要比GET的安全性高智润。比如:通過GET提交數(shù)據(jù)及舍,用戶名和密碼將明文出現(xiàn)在URL上。
登錄頁(yè)面有可能被瀏覽器緩存窟绷;
其他人查看瀏覽器的歷史紀(jì)錄锯玛,那么別人就可以拿到你的賬號(hào)和密碼了。
除此之外钾麸,使用GET提交數(shù)據(jù)還可能會(huì)造成Cross-site request forgery攻擊
四 Http get,post,soap協(xié)議都是在http上運(yùn)行的
-
get:
請(qǐng)求參數(shù)是作為一個(gè)key/value對(duì)的序列(查詢字符串)附加到URL上的
查詢字符串的長(zhǎng)度受到web瀏覽器和web服務(wù)器的限制(如IE最多支持2048個(gè)字符)更振,不適合傳輸大型數(shù)據(jù)集同時(shí),它很不安全
-
post:
請(qǐng)求參數(shù)是在http標(biāo)題的一個(gè)不同部分(名為entity body)傳輸?shù)姆钩ⅲ@一部分用來傳輸表單信息肯腕,因此必須將Content-type設(shè)置為:application/x-www-form- urlencoded。
post設(shè)計(jì)用來支持web窗體上的用戶字段钥平,其參數(shù)也是作為key/value對(duì)傳輸实撒。
但是:它不支持復(fù)雜數(shù)據(jù)類型,因?yàn)閜ost沒有定義傳輸數(shù)據(jù)結(jié)構(gòu)的語義和規(guī)則涉瘾。
-
soap:
是http post的一個(gè)專用版本知态,遵循一種特殊的xml消息格式
Content-type設(shè)置為: text/xml 任何數(shù)據(jù)都可以xml化。
總結(jié)
Http協(xié)議定義了很多與服務(wù)器交互的方法立叛,最基本的有4種负敏,分別是
GET
、POST
秘蛇、PUT
其做、DELETE
一個(gè)URL地址用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET, POST, PUT, DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查赁还,改妖泄,增,刪4個(gè)操作艘策。
我們最常見的就是GET和POST了蹈胡。
GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息
.
我們看看GET和POST的區(qū)別
GET提交的數(shù)據(jù)會(huì)放在URL之后朋蔫,以?分割URL和傳輸數(shù)據(jù)罚渐,參數(shù)之間以&相連, 操作簡(jiǎn)單, 不過容易讓外界看到, 安全性不高驯妄。POST 請(qǐng)求, 將參數(shù)放到 body 里面, POST請(qǐng)求的操作相對(duì)復(fù)雜, 需要將參數(shù)和地址分開, 不過安全性高,參數(shù)放在body里面, 不容易被捕獲搅轿。
GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長(zhǎng)度有限制),而POST方法提交的數(shù)據(jù)沒有限制富玷。
一般用GET來進(jìn)行獲取數(shù)據(jù)璧坟,因?yàn)橛芯彺婕饶拢钥梢越档头?wù)器的壓力;而POST一般用來進(jìn)行操作數(shù)據(jù)雀鹃,如增刪改幻工。
GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值黎茎。
GET方式提交數(shù)據(jù)囊颅,會(huì)帶來安全問題,比如一個(gè)登錄頁(yè)面傅瞻,通過GET方式提交數(shù)據(jù)時(shí)踢代,用戶名和密碼將出現(xiàn)在URL上,如果頁(yè)面可以被緩存或者其他人可以訪問這臺(tái)機(jī)器嗅骄,就可以從歷史記錄獲得該用戶的賬號(hào)和密碼.