今天的面試中,面試官問到一個問題是:你是怎么理解GET和POST這兩個HTTP請求的?
這個我真沒深究中他們中區(qū)別,一下子有點懵了...
我想了想就回答:GET是請求獲取數(shù)據(jù)酱讶,POST是提交數(shù)據(jù);GET沒有POST安全彼乌,會把請求的東西暴露在URL上泻肯。
然后面試官蛋定的問:還有嗎?
“沒有了慰照,我理解的就這么多了软免。。焚挠「嘞簦”
“。。榛泛◎蝓澹”
經(jīng)過個這輪尷尬的面試,回來后迫不及待的把GET與POST深挖出來:
首先什么是HTTP曹锨?
超文本傳輸協(xié)議(HTTP)的設(shè)計目的是保證客戶機與服器之間的通信孤个。就是瀏覽器與服務(wù)器之間的請求-應(yīng)答的協(xié)議。
也是說:你訪問網(wǎng)頁時瀏覽器向服務(wù)器交HTTP請求沛简;服務(wù)器再把你瀏覽器請求的內(nèi)容返回來給你齐鲤,在瀏覽器上顯示。
在HTTP中椒楣,最基本的方法有4種给郊,分別是GET、POST捧灰、PUT淆九、DELETE。對應(yīng)的就是查毛俏、改炭庙、增、刪 4個操作煌寇。常用就是GET:用于獲取/查詢數(shù)據(jù)焕蹄;POST:一般用于更新數(shù)據(jù)。
GET方法
查詢的值在URL中發(fā)送的:
/test/demo_form.asp?name1=value1&name2=value2
可以從URL看到阀溶,GET請求的值是以?分割URL和傳輸數(shù)據(jù)腻脏,參數(shù)之間以&相連。
如果值是英文字母/數(shù)字淌哟,原樣發(fā)送迹卢;如果是空格,轉(zhuǎn)換為+徒仓,如果是中文/其他字符腐碱,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD掉弛,其中%XX中的XX為該符號以16進制表示的ASCII症见。
GET請求可被緩存
GET請求保留在瀏覽器歷史記錄中
GET請求可被收藏為書簽
GET請求不應(yīng)在處理敏感數(shù)據(jù)時使用
GET請求有長度限制(最多只能是1024字節(jié))
GET請求只應(yīng)當用于取回數(shù)據(jù)
因為GET只是獲取數(shù)據(jù),也就相當于查數(shù)據(jù)殃饿。對數(shù)據(jù)庫是不會有影響的谋作,不會修改和增加數(shù)據(jù)。也就是冪等的乎芳,(冪等:我理解是經(jīng)過多次運算什么的遵蚜,最后的值還是跟第一次的值相等)帖池。
POST方法
查詢的值是在POST請求的HTTP消息主體中發(fā)送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value&name2=value2
POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進行大小限制吭净。
POST請求不會被緩存
POST請求不會保留在瀏覽器歷史記錄中
POST不能被收藏為書簽
POST請求對數(shù)據(jù)長度沒有要求
總結(jié)
POST的安全性要比GET的安全性高睡汹。
比如:通過GET提交數(shù)據(jù),用戶名和密碼將出現(xiàn)在URL上寂殉;
登錄頁面有可能被瀏覽器緩存
其他人查看瀏覽器的歷史紀錄囚巴,那么別人就可以拿到你的賬號和密碼了
除此之外,使用GET提交數(shù)據(jù)還可能會造成Cross-site request forgery攻擊
GET是向服務(wù)器發(fā)送獲取數(shù)據(jù)是一種請求
POST是向服務(wù)器提交數(shù)據(jù)的一種請求
在FORM中友扰,Method默認為“GET”彤叉,實質(zhì)上,GET和POST只是發(fā)送機制不同村怪,并不是一個取一個發(fā)秽浇!
參考資料?
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html