大家好谈秫,我是IT修真院成都分院第三期的學(xué)員王奎智惕橙,一枚正直純潔善良的WEB前端程序員。
今天給大家分享一下谓形,修真院官網(wǎng)JS任務(wù)5相關(guān)內(nèi)容灶伊,get與post的區(qū)別,以及application json 與form表單的區(qū)別寒跳。
1.背景介紹
基本概念HTTP:在Web應(yīng)用中谁帕,服務(wù)器把網(wǎng)頁傳給瀏覽器,實(shí)際上就是把網(wǎng)頁的HTML代碼發(fā)送給瀏覽器冯袍,讓瀏覽器顯示出來。而瀏覽器和服務(wù)器之間的傳輸協(xié)議是HTTP碾牌。
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議康愤。
工作原理:HTTP協(xié)議工作于客戶端-服務(wù)端,瀏覽器作為HTTP客戶端通過URL(統(tǒng)一資源定位符)向HTTP服務(wù)端發(fā)送請求,服務(wù)器接收到請求后,向客戶端發(fā)送響應(yīng)信息。
三大特點(diǎn):1.無連接 2.靈活快速 3.無狀態(tài)
消息結(jié)構(gòu)客戶端請求消息:由請求行舶吗、請求頭部征冷、空行、請求數(shù)據(jù)組成誓琼。
2.知識剖析
1.get與post的區(qū)別首先我們要知道GET和POST都是HTTP定義的和服務(wù)器互交的不同方法检激。
1.語義上的不同:GET:獲取指定URL上的資源,是讀操作腹侣。
POST:向指定資源“追加/添加”數(shù)據(jù)叔收。
2.對于“安全”所代表的設(shè)定。根據(jù)HTTP規(guī)范傲隶,GET用于信息獲取饺律,而且應(yīng)該是安全的和冪等的。所謂的安全意味著該操作用于獲取信息而非修改信息跺株。換句話說复濒,GET 請求一般不應(yīng)產(chǎn)生副作用。就是說乒省,它僅僅是獲取資源信息巧颈,就像數(shù)據(jù)庫查詢一樣,不會(huì)修改袖扛,增加數(shù)據(jù)砸泛,不會(huì)影響資源的狀態(tài)。這里安全的含義僅僅是指是非修改信息。冪等意味著對同一URL的多個(gè)請求應(yīng)該返回同樣的結(jié)果晾嘶。
根據(jù)HTTP規(guī)范妓雾,POST表示可能修改變服務(wù)器上的資源的請求。對于傳遞過程來說垒迂,指的是提交的數(shù)據(jù)不會(huì)直接在地址欄看見械姻。
POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念机断。上面“安全”的含義僅僅是不作數(shù)據(jù)修改楷拳,而這里安全的含義是真正的Security的含義,比如:通過GET提交數(shù)據(jù)吏奸,用戶名和密碼將明文出現(xiàn)在URL上欢揖,因?yàn)椋?/p>
(1)登錄頁面有可能被瀏覽器緩存
(2)其他人查看瀏覽器的歷史紀(jì)錄,那么別人就可以拿到你的賬號和密碼了奋蔚,除此之外她混,使用GET提交數(shù)據(jù)還可能會(huì)造成Cross-site request forgery攻擊。
3.請求數(shù)據(jù)方法不同:GET請求的數(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為該符號以16進(jìn)制表示的ASCII嘹锁。HTTP協(xié)議沒有對get和post做長度的限制,但是瀏覽器會(huì)對url長度做限制最多1024字節(jié)着裹,所以get方法傳遞數(shù)據(jù)受限制兼耀。
POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中。如:name1=value1&name2=value2
4.GET是冪等的求冷,POST是非冪等的先介紹下冪等的概念:如果一個(gè)操作沒有副作用瘤运,或者多次操作對資源產(chǎn)生的副作用相同,我們就說這個(gè)操作是冪等的匠题。
get方法用戶獲取資源拯坟,沒有副作用,所以是冪等的韭山;post用于創(chuàng)建資源郁季,是有副作用的冷溃,且副作用不同,所以post不是冪等的梦裂。(兩次相同的POST請求會(huì)在服務(wù)器端創(chuàng)建兩份資源似枕,它們具有不同的URI)
上圖是在W3C上找到的答案.
因?yàn)镻OST請求的協(xié)議并沒有規(guī)定數(shù)據(jù)必須使用什么編碼方式,而數(shù)據(jù)發(fā)送出去年柠,還要服務(wù)器解析成功才行凿歼。服務(wù)器則通常根據(jù)請求頭里的Content-Type字段來獲知消息是以什么方式編碼,再以對應(yīng)方式解析冗恨。而有的接口服務(wù)器則不能解析某些編碼方式的數(shù)據(jù)答憔。因此需要對Content-Type進(jìn)行設(shè)置。
2.application json 與form表單的區(qū)別?application/json 這個(gè) Content-Type 作為響應(yīng)頭大家肯定不陌生掀抹。實(shí)際上虐拓, 現(xiàn)在越來越多的人把它作為請求頭,用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串傲武。 由于 JSON 規(guī)范的流行蓉驹,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify, 服務(wù)端語言也都有處理 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ù)献汗。請求的時(shí)候,首先王污,Content-Type 被指定為 application/x-www-form-urlencoded罢吃; 其次,提交的數(shù)據(jù)按照 key1=val1&key2=val2 的方式進(jìn)行編碼昭齐,key 和 val 都進(jìn)行了 URL 轉(zhuǎn)碼尿招。 大部分服務(wù)端語言都對這種方式有很好的支持。
3.常見問題GET和POST使用環(huán)境
4.解決方案應(yīng)該符合語義的使用;即獲取數(shù)據(jù)使用GET阱驾,增加數(shù)據(jù)使用POST.
當(dāng)請求無副作用時(shí)(如進(jìn)行搜索)就谜,便可使用GET方法;當(dāng)請求有副作用時(shí)(如添加數(shù)據(jù)行)里覆,則用POST方法丧荐。
5.編碼實(shí)戰(zhàn)參考任務(wù)代碼
6.擴(kuò)展思考被提問get和post如何唬倒面試官
普通回答:GET在瀏覽器回退時(shí)是無害的,而POST會(huì)再次提交請求喧枷。
GET產(chǎn)生的URL地址可以被Bookmark虹统,而POST不可以弓坞。
GET請求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì)车荔,除非手動(dòng)設(shè)置渡冻。
GET請求只能進(jìn)行url編碼,而POST支持多種編碼方式忧便。
GET請求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里族吻,而POST中的參數(shù)不會(huì)被保留。
GET請求在URL中傳送的參數(shù)是有長度限制的茬腿,而POST么有呼奢。
對參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符切平,而POST沒有限制握础。
GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上悴品,所以不能用來傳遞敏感信息禀综。
GET參數(shù)通過URL傳遞,POST放在Request body中苔严。
清新回答:GET和POST是什么定枷?HTTP協(xié)議中的兩種發(fā)送請求的方法。
HTTP是什么届氢?HTTP是基于TCP/IP的關(guān)于數(shù)據(jù)如何在萬維網(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ù)包。
對于GET方式的請求惜犀,瀏覽器會(huì)把http header和data一并發(fā)送出去铛碑,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù)); 而對于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.更多討論
今天的分享就到這里啦碗暗,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)梢夯、留言言疗、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開始颂砸,找個(gè)師兄吧恃,帶你入門帕胆,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷茫”吐咳。
這里是技能樹.IT修真院评凝,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線窟扑,學(xué)習(xí)透明化赋除,成長可見化,師兄1對1免費(fèi)指導(dǎo)戳护〗鹇眨快來與我一起學(xué)習(xí)吧 !