HTTP是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫
- 傳輸協(xié)議就是計算機與計算機之間的通信交流
- 當(dāng)然肯定不止http一個傳輸協(xié)議
接下來我們就來看看有哪幾種傳輸協(xié)議:
FILE(本地文件傳輸協(xié)議)
FTP(文件傳輸協(xié)議)
TELNET(遠(yuǎn)程登錄協(xié)議)
GOPHER(信息查詢系統(tǒng)協(xié)議)
WAIS(廣域信息服務(wù)器協(xié)議)
MAILTO(電子郵件協(xié)議)
還有一些我們就不一一列舉了
今天我們主要講Http傳輸協(xié)議中的GET與POST
- Get與Post請求到底有什么區(qū)別呢?
- 在公司的面試中,也會經(jīng)常的問及類似這樣的問題,看似很簡單展东,但是不同層次的人會回答出不同的結(jié)果
一句簡單的話概括:
提及GET和POST的區(qū)別,一定要確定基于什么前提下,在不同的前提下有不同的答案
首先我們先來舉個例子吧!這樣更容易理解
- 假設(shè)有兩個人(一男一女):男的叫阿飛,女的叫阿紫
- 阿飛住在飛哥村,阿紫住在王者村,阿飛到阿紫家可以有很多種選擇妹沙,走著去、駕車去勺届、坐飛機去等等强饮。阿飛通常選擇駕車過去。
這里的兩個村相當(dāng)于兩臺計算機,阿飛與阿紫相當(dāng)于這兩臺計算機中的兩個程序,假如這兩個程序要進行通信,他們之間進行通信的方法有很多種,就好比很多交通工具一樣,假設(shè)阿飛開車去就相當(dāng)于網(wǎng)絡(luò)中的Http協(xié)議.
- 但不過阿飛有兩輛車子,一輛是勞斯萊斯,一輛是可以裝貨拖拉機
- 兩種車就好比是HTTP協(xié)議中的兩種方式,我們假設(shè)轎車是GET請求方式,裝貨拖拉機是POST請求方式偿渡。
- 假如有一天阿紫希望阿飛接她來阿飛的飛哥村玩耍
阿飛要去接阿紫,就好比程序A要向程序B發(fā)出一個請求霸奕。從原理上說溜宽,無論是轎車還是貨車都是車,都能夠把人接回來质帅。所以在本質(zhì)上适揉,GET請求和POST請求都能獲取數(shù)據(jù)。
這時候,阿飛的朋友(也就是最帥的龍哥)出來了,說道:"你是不是傻,去接人開轎車多好啊,開拖拉機干嘛煤惩?費油先不談,說不定人家那還不讓拖拉機停車呢!"
- 既然GET和POST都可以做到獲取數(shù)據(jù)嫉嘀,那么為什么我們通常獲取數(shù)據(jù)使用GET而不使用POST呢?
- 原因就是在于這個(最帥的龍哥)限制著兩種請求的使用方法
(最帥的龍哥)就相當(dāng)于是ISO國際標(biāo)準(zhǔn)化組織,這個組織也說了一堆類似龍哥的話,這堆話被稱為RFC規(guī)范
我們通常說的HTTP協(xié)議實際上是基于RFC規(guī)范的,實際上GET和POST請求的語法是完全相同的,但是在RFC規(guī)范中,給GET請求和POST請求規(guī)定了語義,規(guī)定GET用來獲取信息,POST用來發(fā)送信息
- 每當(dāng)過節(jié)過年的時候,阿飛想要給阿紫家送一些禮物的時候,阿飛按照龍哥的囑咐,開著拖拉機給阿紫家送禮物去了.當(dāng)然,送過去了一些禮物也會稍微拉回來一點小禮物~
這就是按照RFC的規(guī)范來執(zhí)行的,當(dāng)阿飛想要送年貨的時候,就會開拖拉機過去;在互聯(lián)網(wǎng)環(huán)境中,如果想要發(fā)送信息就要使用POST方法魄揉。
注意點:POST方法雖然是發(fā)送消息的剪侮,但也是有Response的,在請求返回的時候帶回來一點數(shù)據(jù)也是被允許的
Response對象用于向客戶端瀏覽器發(fā)送數(shù)據(jù),用戶可以使用該對象將服務(wù)器的數(shù)據(jù)以HTML的格式發(fā)送到用戶端的瀏覽器瓣俯,它與Request組成了一對接收杰标、發(fā)送數(shù)據(jù)的對象,這也是實現(xiàn)動態(tài)的基礎(chǔ)
Web服務(wù)器收到客戶端的http請求彩匕,會針對每一次請求腔剂,分別創(chuàng)建一個用于代表請求的Request對象、和代表響應(yīng)的Response對象驼仪。
Request和Response對象即然代表請求和響應(yīng)掸犬,那我們要獲取客戶機提交過來的數(shù)據(jù),只需要找Request對象就行了绪爸。要向容器輸出數(shù)據(jù)湾碎,只需要找Response對象就行了。
那么這時候問題又來了,阿飛如果不聽龍哥的怎么辦?那這個規(guī)范不就沒有作用了嗎?這個時候龍哥也是很有辦法的,龍哥就坐在阿飛村子門口,如果阿飛想運貨出去的時候,開的不是拖拉機就不讓出村子門口
光有規(guī)范沒有具體的軟件實施也是沒有意義的,所以很多的軟件都遵從了RFC的規(guī)范,比如我們熟悉的Chrome瀏覽器.所以我們想用GET方式發(fā)送文件或者圖片是不可能的~就像阿飛不可能用勞斯萊斯去給阿紫送禮物一樣
- 當(dāng)人們問起GET和POST的區(qū)別時毡泻,我們要先確定胜茧,這里的GET和POST是基于什么前提的?
如果什么前提都沒有,也就是不用任何規(guī)范限制的話仇味,我們只考慮語法來說呻顽,這兩個方式是沒有任何區(qū)別的,只有名字不一樣
如果是基于RFC規(guī)范的,那么問題就又來了.是基于RFC理論的,還是基于具體的實現(xiàn)的
(1)如果是基于RFC理論的,我們稱這個為Specification丹墨。那么GET和POST是具有相同的語法廊遍,但是不具備相同的語義,GET方式用作獲取信息贩挣,POST方式用作發(fā)送信息
(2)如果是基于RFC的具體實現(xiàn)的喉前,我們稱之為implementation。其實要區(qū)分是具體的哪一種實現(xiàn)王财。我們通常默認(rèn)指的是瀏覽器實現(xiàn)的RFC卵迂。當(dāng)然不止瀏覽器,我們?nèi)魏稳硕伎梢宰约涸O(shè)計一個HTTP協(xié)議的接口绒净,使用RFC規(guī)范见咒,當(dāng)然這些是我們不用考慮的,因為并不通用
所以我們只需要考慮瀏覽器實現(xiàn)的RFC,或者說Web環(huán)境下的RFC
1.GET的數(shù)據(jù)在 URL 中對所有人都是可見的(也就是公開的)POST的數(shù)據(jù)不會顯示在 URL 中(私密隱藏)
- GET對數(shù)據(jù)長度有限制挂疆,當(dāng)發(fā)送數(shù)據(jù)時改览,GET 方法會向 URL 添加數(shù)據(jù);URL 的長度是受限制的(URL 的最大長度是 2048 個字符)POST方法無限制
- GET可收藏為書簽,POST不可收藏為書簽缤言。
- GET后退按鈕/刷新無影響宝当,POST數(shù)據(jù)會被重新提交(瀏覽器應(yīng)該告知用戶數(shù)據(jù)會被重新提交)。
- GET編碼類型application/x-www-form-url胆萧,POST編碼類型encodedapplication/x-www-form-urlencoded 或 multipart/form-data庆揩。為二進制數(shù)據(jù)使用多重編碼。
- GET歷史參數(shù)會保留在瀏覽器歷史中。POST參數(shù)不會保存在瀏覽器歷史中盾鳞。
- GET只允許 ASCII 字符犬性。POST沒有限制,也允許二進制數(shù)據(jù)。
- 與 POST 相比腾仅,GET 的安全性較差,因為所發(fā)送的數(shù)據(jù)是 URL 的一部分套利。在發(fā)送密碼或其他敏感信息時絕不要使用 GET !POST 比 GET 更安全推励,因為參數(shù)不會被保存在瀏覽器歷史或 web 服務(wù)器日志中。