get 與 post的區別?application json 與form表單的區別?


這里是修真院前端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】

八個方面深度解析前端知識/技能,本篇分享的是:

【get 與 post的區別?application json 與form表單的區別?】

1.背景介紹

首先說HTTP的概念:在Web應用中,服務器把網頁傳給瀏覽器,實際上就是把網頁的HTML代碼發送給瀏覽器,讓瀏覽器顯示出來。而瀏覽器和服務器之間的傳輸協議是HTTP。HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web)服務器傳輸超文本到本地瀏覽器的傳送協議。 工作原理:HTTP協議工作於客戶端-服務端,瀏覽器作為HTTP客戶端通過URL(統一資源定位符)向HTTP服務端發送請求,服務器接收到請求后,向客戶端發送響應信息。

三個特點:無連接、無狀態、靈活快速

消息結構:

兩種請求方法:

GET:請求指定的頁面信息,並返回實體主體

POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。

2.知識剖析

1.)get和post的區別:

語義不同:

GET:獲取指定URL上的資源,是讀操作,

POST:向指定資源“追加/添加”數據.

對於安全所表達的設定:

根據HTTP規范,GET用於信息獲取,而且應該是安全的和冪等的。所謂安全的意味着該操作用於獲取信息而非修改信息。換句話說,GET請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像數據庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。這里安全的含義僅僅是指是非修改信息。

冪等的意味着對同一URL的多個請求應該返回同樣的結果

根據HTTP規范,POST表示可能修改變服務器上的資源的請求。

對於傳遞過程來說,指的是提交的數據不會直接在地址欄看見。(1)登錄頁面有可能被瀏覽器緩存,(2)其他人查看瀏覽器的歷史紀錄。

POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作數據修改,而這里安全的含義是真正的Security的含義,比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因為(1)登錄頁面有可能被瀏覽器緩存,(2)其他人查看瀏覽器的歷史紀錄,那么別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery攻擊。

請求數據的方法:

GET請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII。HTTP協議沒有對get和post做長度的限制,但是瀏覽器會對url長度做限制最多1024字節,所以get方法傳遞數據受限制。

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

冪等:

GET是冪等的,POST是非冪等的,先介紹下冪等的概念:如果一個操作沒有副作用,或者多次操作對資源產生的副作用相同,我們就說這個操作是冪等的.

get方法用戶獲取資源,沒有副作用,所以是冪等的;post用於創建資源,是有副作用的,且副作用不同,所以post不是冪等的。(兩次相同的POST請求會在服務器端創建兩份資源,它們具有不同的URI)

2.application JSON和Form表單的區別

因為POST請求的協議並沒有規定數據必須使用什么編碼方式,而數據發送出去,還要服務器解析成功才行。服務器則通常根據請求頭里的Content-Type字段來獲知消息是以什么方式編碼,再以對應方式解析。而有的接口服務器則不能解析某些編碼方式的數據。因此需要對Content-Type進行設置。

application/json這個Content-Type作為響應頭大家肯定不陌生。實際上, 現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化后的JSON字符串。 由於JSON規范的流行,除了低版本IE之外的各大瀏覽器都原生支持JSON.stringify, 服務端語言也都有處理JSON的函數,使用JSON不會遇上什么麻煩。angular中默認的就是這個格式

application/x-www-form-urlencoded這應該是最常見的POST提交數據的方式了。瀏覽器的原生form表單,如果不設置enctype屬性, 那么最終就會以application/x-www-form-urlencoded方式提交數據。請求類似於下面這樣( 無關的請求頭在本文中都省略掉了):POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3首先,Content-Type被指定為application/x-www-form-urlencoded; 其次,提交的數據按照key1=val1&key2=val2的方式進行編碼,key和val都進行了URL轉碼。 大部分服務端語言都對這種方式有很好的支持。

3.常見問題

GET和POST使用的環境

4.解決方案

應該符合語義的使用;即獲取數據使用GET,增加數據使用POST.

當請求無副作用時(如進行搜索),便可使用GET方法;當請求有副作用時(如添加數據行),則用POST方法。

5.編碼實戰:

參考任務代碼

6.拓展思考

如何回答get和post的不同:

普通回答:

GET在瀏覽器回退時是無害的,而POST會再次提交請求。

GET產生的URL地址可以被Bookmark,而POST不可以。

GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。

GET請求只能進行url編碼,而POST支持多種編碼方式。

GET請求參數會被完整保留在瀏覽器歷史記錄里,而POST中的參數不會被保留。

GET請求在URL中傳送的參數是有長度限制的,而POST么有。

對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。

GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。

GET參數通過URL傳遞,POST放在Request body中。

清新回答:

GET和POST是什么?HTTP協議中的兩種發送請求的方法。HTTP是什么?HTTP是基於TCP/IP的關於數據如何在萬維網中如何通信的協議。HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。GET產生一個TCP數據包;POST產生兩個TCP數據包。

對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據); 而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。

7.參考文獻

https://www.oschina.net/news/77354/http-get-post-different

http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

更多內容,可以加入IT交流群565734203與大家一起討論交流

 

這里是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到互聯網的聚集地


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM