get 與 post的區(qū)別?application json 與form表單的區(qū)別?

1.背景介紹

基本概念HTTP:在Web應(yīng)用中伐割,服務(wù)器把網(wǎng)頁(yè)傳給瀏覽器休偶,實(shí)際上就是把網(wǎng)頁(yè)的HTML代碼發(fā)送給瀏覽器换途,讓瀏覽器顯示出來咬荷。而瀏覽器和服務(wù)器之間的傳輸協(xié)議是HTTP。

HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬(wàn)維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議迷捧。

工作原理:HTTP協(xié)議工作于客戶端-服務(wù)端,瀏覽器作為HTTP客戶端通過URL(統(tǒng)一資源定位符)向HTTP服務(wù)端發(fā)送請(qǐng)求,服務(wù)器接收到請(qǐng)求后,向客戶端發(fā)送響應(yīng)信息织咧。

三大特點(diǎn):1.無(wú)連接 2.靈活快速 3.無(wú)狀態(tài)

消息結(jié)構(gòu)客戶端請(qǐng)求消息:由請(qǐng)求行、請(qǐng)求頭部漠秋、空行笙蒙、請(qǐng)求數(shù)據(jù)組成。

2.知識(shí)剖析

1.get與post的區(qū)別首先我們要知道GET和POST都是HTTP定義的和服務(wù)器互交的不同方法庆锦。

1.語(yǔ)義上的不同:GET:獲取指定URL上的資源手趣,是讀操作。

POST:向指定資源“追加/添加”數(shù)據(jù)肥荔。

2.對(duì)于“安全”所代表的設(shè)定绿渣。根據(jù)HTTP規(guī)范,GET用于信息獲取燕耿,而且應(yīng)該是安全的和冪等的中符。所謂的安全意味著該操作用于獲取信息而非修改信息。換句話說誉帅,GET 請(qǐng)求一般不應(yīng)產(chǎn)生副作用淀散。就是說,它僅僅是獲取資源信息蚜锨,就像數(shù)據(jù)庫(kù)查詢一樣档插,不會(huì)修改,增加數(shù)據(jù)亚再,不會(huì)影響資源的狀態(tài)郭膛。這里安全的含義僅僅是指是非修改信息。冪等意味著對(duì)同一URL的多個(gè)請(qǐng)求應(yīng)該返回同樣的結(jié)果氛悬。

根據(jù)HTTP規(guī)范则剃,POST表示可能修改變服務(wù)器上的資源的請(qǐng)求耘柱。對(duì)于傳遞過程來說,指的是提交的數(shù)據(jù)不會(huì)直接在地址欄看見棍现。

POST的安全性要比GET的安全性高调煎。注意:這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改己肮,而這里安全的含義是真正的Security的含義士袄,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上谎僻,因?yàn)椋?/p>

(1)登錄頁(yè)面有可能被瀏覽器緩存

(2)其他人查看瀏覽器的歷史紀(jì)錄窖剑,那么別人就可以拿到你的賬號(hào)和密碼了,除此之外戈稿,使用GET提交數(shù)據(jù)還可能會(huì)造成Cross-site request forgery攻擊。

3.請(qǐng)求數(shù)據(jù)方法不同:GET請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中)讶舰,以?分割URL和傳輸數(shù)據(jù)鞍盗,參數(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锚烦。HTTP協(xié)議沒有對(duì)get和post做長(zhǎng)度的限制,但是瀏覽器會(huì)對(duì)url長(zhǎng)度做限制最多1024字節(jié)帝雇,所以get方法傳遞數(shù)據(jù)受限制涮俄。

POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中。如:name1=value1&name2=value2

4.GET是冪等的尸闸,POST是非冪等的先介紹下冪等的概念:如果一個(gè)操作沒有副作用彻亲,或者多次操作對(duì)資源產(chǎn)生的副作用相同,我們就說這個(gè)操作是冪等的吮廉。

get方法用戶獲取資源苞尝,沒有副作用,所以是冪等的宦芦;post用于創(chuàng)建資源宙址,是有副作用的,且副作用不同调卑,所以post不是冪等的曼氛。(兩次相同的POST請(qǐng)求會(huì)在服務(wù)器端創(chuàng)建兩份資源豁辉,它們具有不同的URI)

上圖是在W3C上找到的答案.

因?yàn)镻OST請(qǐng)求的協(xié)議并沒有規(guī)定數(shù)據(jù)必須使用什么編碼方式,而數(shù)據(jù)發(fā)送出去舀患,還要服務(wù)器解析成功才行徽级。服務(wù)器則通常根據(jù)請(qǐng)求頭里的Content-Type字段來獲知消息是以什么方式編碼,再以對(duì)應(yīng)方式解析聊浅。而有的接口服務(wù)器則不能解析某些編碼方式的數(shù)據(jù)餐抢。因此需要對(duì)Content-Type進(jìn)行設(shè)置。

2.application json 與form表單的區(qū)別?application/json 這個(gè) Content-Type 作為響應(yīng)頭大家肯定不陌生低匙。實(shí)際上旷痕, 現(xiàn)在越來越多的人把它作為請(qǐng)求頭,用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串顽冶。 由于 JSON 規(guī)范的流行欺抗,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify, 服務(wù)端語(yǔ)言也都有處理 JSON 的函數(shù)强重,使用 JSON 不會(huì)遇上什么麻煩绞呈。angular中默認(rèn)的就是這個(gè)格式。

application/x-www-form-urlencoded 這應(yīng)該是最常見的 POST 提交數(shù)據(jù)的方式了间景。瀏覽器的原生 form 表單佃声,如果不設(shè)置 enctype 屬性, 那么最終就會(huì)以 application/x-www-form-urlencoded 方式提交數(shù)據(jù)倘要。請(qǐng)求的時(shí)候圾亏,首先,Content-Type 被指定為 application/x-www-form-urlencoded封拧; 其次志鹃,提交的數(shù)據(jù)按照 key1=val1&key2=val2 的方式進(jìn)行編碼,key 和 val 都進(jìn)行了 URL 轉(zhuǎn)碼泽西。 大部分服務(wù)端語(yǔ)言都對(duì)這種方式有很好的支持弄跌。

3.常見問題GET和POST使用環(huán)境

4.解決方案應(yīng)該符合語(yǔ)義的使用;即獲取數(shù)據(jù)使用GET,增加數(shù)據(jù)使用POST.

當(dāng)請(qǐng)求無(wú)副作用時(shí)(如進(jìn)行搜索)尝苇,便可使用GET方法铛只;當(dāng)請(qǐng)求有副作用時(shí)(如添加數(shù)據(jù)行),則用POST方法糠溜。

5.編碼實(shí)戰(zhàn)參考任務(wù)代碼

6.擴(kuò)展思考被提問get和post如何唬倒面試官

普通回答:GET在瀏覽器回退時(shí)是無(wú)害的淳玩,而POST會(huì)再次提交請(qǐng)求。

GET產(chǎn)生的URL地址可以被Bookmark非竿,而POST不可以蜕着。

GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置承匣。

GET請(qǐng)求只能進(jìn)行url編碼蓖乘,而POST支持多種編碼方式。

GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里韧骗,而POST中的參數(shù)不會(huì)被保留嘉抒。

GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST么有袍暴。

對(duì)參數(shù)的數(shù)據(jù)類型些侍,GET只接受ASCII字符,而POST沒有限制政模。

GET比POST更不安全岗宣,因?yàn)閰?shù)直接暴露在URL上,所以不能用來傳遞敏感信息淋样。

GET參數(shù)通過URL傳遞耗式,POST放在Request body中。

清新回答:GET和POST是什么趁猴?HTTP協(xié)議中的兩種發(fā)送請(qǐng)求的方法刊咳。

HTTP是什么?HTTP是基于TCP/IP的關(guān)于數(shù)據(jù)如何在萬(wàn)維網(wǎng)中如何通信的協(xié)議躲叼。

HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP企巢,也就是說枫慷,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的浪规。你要給GET加上request body或听,給POST帶上url參數(shù),技術(shù)上是完全行的通的笋婿。 GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包誉裆;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。

對(duì)于GET方式的請(qǐng)求缸濒,瀏覽器會(huì)把http header和data一并發(fā)送出去足丢,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù)); 而對(duì)于POST庇配,瀏覽器先發(fā)送header斩跌,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data捞慌,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))耀鸦。

7.參考文獻(xiàn)參考一:理解本真的REST架構(gòu)風(fēng)格

參考二:W3C

參考三:99%的人理解錯(cuò) HTTP 中 GET 與 POST 的區(qū)別

8.更多討論

Q:還有哪些其他的提交表頭的方法?

A:multipart/form-data啸澡,這又是一個(gè)常見的 POST 數(shù)據(jù)提交的方式袖订。我們使用表單上傳文件時(shí)氮帐,必須讓 form 的 enctyped 等于這個(gè)值。

text/xml它是一種使用 HTTP 作為傳輸協(xié)議洛姑,XML 作為編碼方式的遠(yuǎn)程調(diào)用規(guī)范

Q:get和post的安全性上沐?

A:Get提交,將要提交的內(nèi)容方法哦URL后邊使用吏口?進(jìn)行連接奄容。這種提交方式可能讓一些用戶看到一些保密信息,比如用戶名产徊,密碼等信息昂勒。帶來的一定的安全隱患。而post提交方式舟铜,是將請(qǐng)求的信息放到數(shù)據(jù)報(bào)中(請(qǐng)求體)戈盈,其他人職能看到URL的信息,而不能看到別的信息谆刨。從而提高了安全性,這就是我們最通常的認(rèn)識(shí)偶然看到了一篇博客塘娶,里邊提到get方式也是安全的。因?yàn)槲覀兲峤坏拿舾行畔⑷玻话愣际沁M(jìn)行不可逆加密的刁岸!所以得到了頁(yè)沒有什么。他們安全性我們只考慮了用戶而沒有考慮服務(wù)器她我,post方式提交的數(shù)據(jù)的長(zhǎng)度不受限制虹曙,所以黑客可以向服務(wù)器提交大量的數(shù)據(jù),致使服務(wù)器忙于處理這些數(shù)據(jù)番舆,而無(wú)暇處理用戶的正常請(qǐng)求酝碳,到處服務(wù)器癱瘓!當(dāng)我們使用get 提交的時(shí)候恨狈,不要提交一些敏感數(shù)據(jù)疏哗。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市禾怠,隨后出現(xiàn)的幾起案子返奉,更是在濱河造成了極大的恐慌,老刑警劉巖吗氏,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡瓶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡牲证,警方通過查閱死者的電腦和手機(jī)哮针,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人十厢,你說我怎么就攤上這事等太。” “怎么了蛮放?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵缩抡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我包颁,道長(zhǎng)瞻想,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任娩嚼,我火速辦了婚禮蘑险,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岳悟。我一直安慰自己佃迄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布贵少。 她就那樣靜靜地躺著呵俏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滔灶。 梳的紋絲不亂的頭發(fā)上普碎,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音录平,去河邊找鬼麻车。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萄涯,可吹牛的內(nèi)容都是我干的绪氛。 我是一名探鬼主播唆鸡,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼涝影,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了争占?” 一聲冷哼從身側(cè)響起燃逻,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臂痕,沒想到半個(gè)月后伯襟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡握童,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年姆怪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稽揭,死狀恐怖俺附,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溪掀,我是刑警寧澤事镣,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站揪胃,受9級(jí)特大地震影響璃哟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喊递,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一随闪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧册舞,春花似錦蕴掏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至藐石,卻和暖如春即供,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背于微。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工逗嫡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人株依。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓驱证,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恋腕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抹锄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容