2018-09-17GET與POST的真正區(qū)別

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是基于什么前提的?
  1. 如果什么前提都沒有,也就是不用任何規(guī)范限制的話,我們只考慮語法來說,這兩個(gè)方式是沒有任何區(qū)別的,只有名字不一樣

  2. 如果是基于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 中(私密隱藏)

  1. GET對數(shù)據(jù)長度有限制,當(dāng)發(fā)送數(shù)據(jù)時(shí),GET 方法會(huì)向 URL 添加數(shù)據(jù);URL 的長度是受限制的(URL 的最大長度是 2048 個(gè)字符)POST方法無限制
  2. GET可收藏為書簽,POST不可收藏為書簽。
  3. GET后退按鈕/刷新無影響,POST數(shù)據(jù)會(huì)被重新提交(瀏覽器應(yīng)該告知用戶數(shù)據(jù)會(huì)被重新提交)。
  4. GET編碼類型application/x-www-form-url,POST編碼類型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。為二進(jìn)制數(shù)據(jù)使用多重編碼。
  5. GET歷史參數(shù)會(huì)保留在瀏覽器歷史中。POST參數(shù)不會(huì)保存在瀏覽器歷史中。
  6. GET只允許 ASCII 字符。POST沒有限制,也允許二進(jìn)制數(shù)據(jù)。
  7. 與 POST 相比,GET 的安全性較差,因?yàn)樗l(fā)送的數(shù)據(jù)是 URL 的一部分。在發(fā)送密碼或其他敏感信息時(shí)絕不要使用 GET !POST 比 GET 更安全,因?yàn)閰?shù)不會(huì)被保存在瀏覽器歷史或 web 服務(wù)器日志中。
以上這些點(diǎn)都是我們常見的,還有一些我們不常見的,比如GET請求只會(huì)有一次TCP連接,而POST請求會(huì)有兩次TCP連接
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,924評論 0 6
  • 作者:楊光鏈接:https://www.zhihu.com/question/28586791/answer/14...
    studystudy閱讀 460評論 0 2
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,939評論 1 92
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 跟我有過瓜葛的女孩子不少,但真正很喜歡我的不多,小鐘是其中一個(gè)。 小鐘是我的初中同學(xué),初三調(diào)班后才認(rèn)識(shí)她。開學(xué)第一...
    Blasky閱讀 199評論 0 0

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