HTTP是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫
- 傳輸協(xié)議就是計(jì)算機(jī)與計(jì)算機(jī)之間的通信交流
- 當(dāng)然肯定不止http一個(gè)傳輸協(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ū)別呢?
- 在公司的面試中,也會(huì)經(jīng)常的問及類似這樣的問題,看似很簡單,但是不同層次的人會(huì)回答出不同的結(jié)果
一句簡單的話概括:
提及GET和POST的區(qū)別,一定要確定基于什么前提下,在不同的前提下有不同的答案
首先我們先來舉個(gè)例子吧!這樣更容易理解
- 假設(shè)有兩個(gè)人(一男一女):男的叫阿飛,女的叫阿紫
- 阿飛住在飛哥村,阿紫住在王者村,阿飛到阿紫家可以有很多種選擇,走著去、駕車去、坐飛機(jī)去等等。阿飛通常選擇駕車過去。
這里的兩個(gè)村相當(dāng)于兩臺(tái)計(jì)算機(jī),阿飛與阿紫相當(dāng)于這兩臺(tái)計(jì)算機(jī)中的兩個(gè)程序,假如這兩個(gè)程序要進(jìn)行通信,他們之間進(jìn)行通信的方法有很多種,就好比很多交通工具一樣,假設(shè)阿飛開車去就相當(dāng)于網(wǎng)絡(luò)中的Http協(xié)議.
- 但不過阿飛有兩輛車子,一輛是勞斯萊斯,一輛是可以裝貨拖拉機(jī)
- 兩種車就好比是HTTP協(xié)議中的兩種方式,我們假設(shè)轎車是GET請求方式,裝貨拖拉機(jī)是POST請求方式。
- 假如有一天阿紫希望阿飛接她來阿飛的飛哥村玩耍
阿飛要去接阿紫,就好比程序A要向程序B發(fā)出一個(gè)請求。從原理上說,無論是轎車還是貨車都是車,都能夠把人接回來。所以在本質(zhì)上,GET請求和POST請求都能獲取數(shù)據(jù)。
這時(shí)候,阿飛的朋友(也就是最帥的龍哥)出來了,說道:"你是不是傻,去接人開轎車多好啊,開拖拉機(jī)干嘛?費(fèi)油先不談,說不定人家那還不讓拖拉機(jī)停車呢!"
- 既然GET和POST都可以做到獲取數(shù)據(jù),那么為什么我們通常獲取數(shù)據(jù)使用GET而不使用POST呢?
- 原因就是在于這個(gè)(最帥的龍哥)限制著兩種請求的使用方法
(最帥的龍哥)就相當(dāng)于是ISO國際標(biāo)準(zhǔn)化組織,這個(gè)組織也說了一堆類似龍哥的話,這堆話被稱為RFC規(guī)范
我們通常說的HTTP協(xié)議實(shí)際上是基于RFC規(guī)范的,實(shí)際上GET和POST請求的語法是完全相同的,但是在RFC規(guī)范中,給GET請求和POST請求規(guī)定了語義,規(guī)定GET用來獲取信息,POST用來發(fā)送信息
- 每當(dāng)過節(jié)過年的時(shí)候,阿飛想要給阿紫家送一些禮物的時(shí)候,阿飛按照龍哥的囑咐,開著拖拉機(jī)給阿紫家送禮物去了.當(dāng)然,送過去了一些禮物也會(huì)稍微拉回來一點(diǎn)小禮物~
這就是按照RFC的規(guī)范來執(zhí)行的,當(dāng)阿飛想要送年貨的時(shí)候,就會(huì)開拖拉機(jī)過去;在互聯(lián)網(wǎng)環(huán)境中,如果想要發(fā)送信息就要使用POST方法。
注意點(diǎn):POST方法雖然是發(fā)送消息的,但也是有Response的,在請求返回的時(shí)候帶回來一點(diǎn)數(shù)據(jù)也是被允許的
Response對象用于向客戶端瀏覽器發(fā)送數(shù)據(jù),用戶可以使用該對象將服務(wù)器的數(shù)據(jù)以HTML的格式發(fā)送到用戶端的瀏覽器,它與Request組成了一對接收、發(fā)送數(shù)據(jù)的對象,這也是實(shí)現(xiàn)動(dòng)態(tài)的基礎(chǔ)
Web服務(wù)器收到客戶端的http請求,會(huì)針對每一次請求,分別創(chuàng)建一個(gè)用于代表請求的Request對象、和代表響應(yīng)的Response對象。
Request和Response對象即然代表請求和響應(yīng),那我們要獲取客戶機(jī)提交過來的數(shù)據(jù),只需要找Request對象就行了。要向容器輸出數(shù)據(jù),只需要找Response對象就行了。
那么這時(shí)候問題又來了,阿飛如果不聽龍哥的怎么辦?那這個(gè)規(guī)范不就沒有作用了嗎?這個(gè)時(shí)候龍哥也是很有辦法的,龍哥就坐在阿飛村子門口,如果阿飛想運(yùn)貨出去的時(shí)候,開的不是拖拉機(jī)就不讓出村子門口
光有規(guī)范沒有具體的軟件實(shí)施也是沒有意義的,所以很多的軟件都遵從了RFC的規(guī)范,比如我們熟悉的Chrome瀏覽器.所以我們想用GET方式發(fā)送文件或者圖片是不可能的~就像阿飛不可能用勞斯萊斯去給阿紫送禮物一樣
- 當(dāng)人們問起GET和POST的區(qū)別時(shí),我們要先確定,這里的GET和POST是基于什么前提的?
如果什么前提都沒有,也就是不用任何規(guī)范限制的話,我們只考慮語法來說,這兩個(gè)方式是沒有任何區(qū)別的,只有名字不一樣
如果是基于RFC規(guī)范的,那么問題就又來了.是基于RFC理論的,還是基于具體的實(shí)現(xiàn)的
(1)如果是基于RFC理論的,我們稱這個(gè)為Specification。那么GET和POST是具有相同的語法,但是不具備相同的語義,GET方式用作獲取信息,POST方式用作發(fā)送信息
(2)如果是基于RFC的具體實(shí)現(xiàn)的,我們稱之為implementation。其實(shí)要區(qū)分是具體的哪一種實(shí)現(xiàn)。我們通常默認(rèn)指的是瀏覽器實(shí)現(xiàn)的RFC。當(dāng)然不止瀏覽器,我們?nèi)魏稳硕伎梢宰约涸O(shè)計(jì)一個(gè)HTTP協(xié)議的接口,使用RFC規(guī)范,當(dāng)然這些是我們不用考慮的,因?yàn)椴⒉煌ㄓ?/p>
所以我們只需要考慮瀏覽器實(shí)現(xiàn)的RFC,或者說Web環(huán)境下的RFC
1.GET的數(shù)據(jù)在 URL 中對所有人都是可見的(也就是公開的)POST的數(shù)據(jù)不會(huì)顯示在 URL 中(私密隱藏)
- GET對數(shù)據(jù)長度有限制,當(dāng)發(fā)送數(shù)據(jù)時(shí),GET 方法會(huì)向 URL 添加數(shù)據(jù);URL 的長度是受限制的(URL 的最大長度是 2048 個(gè)字符)POST方法無限制
- GET可收藏為書簽,POST不可收藏為書簽。
- GET后退按鈕/刷新無影響,POST數(shù)據(jù)會(huì)被重新提交(瀏覽器應(yīng)該告知用戶數(shù)據(jù)會(huì)被重新提交)。
- GET編碼類型application/x-www-form-url,POST編碼類型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。為二進(jìn)制數(shù)據(jù)使用多重編碼。
- GET歷史參數(shù)會(huì)保留在瀏覽器歷史中。POST參數(shù)不會(huì)保存在瀏覽器歷史中。
- GET只允許 ASCII 字符。POST沒有限制,也允許二進(jìn)制數(shù)據(jù)。
- 與 POST 相比,GET 的安全性較差,因?yàn)樗l(fā)送的數(shù)據(jù)是 URL 的一部分。在發(fā)送密碼或其他敏感信息時(shí)絕不要使用 GET !POST 比 GET 更安全,因?yàn)閰?shù)不會(huì)被保存在瀏覽器歷史或 web 服務(wù)器日志中。