深入【Get】与【Post】区别
?區(qū)別:
GET請求在URL中傳送的參數(shù)是有長度限制的,而POST沒有。
GET比POST更不安全,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息。而POST數(shù)據(jù)不會顯示在URL中。是放在Request body中。
對參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符,而POST沒有限制。
GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里;相反,POST請求參數(shù)也不會被瀏覽器保留。
GET請求只能進行url編碼(application/x-www-form-urlencoded),而POST支持多種編碼方式。
GET請求會被瀏覽器主動緩存,而POST不會,除非手動設(shè)置。
GET在瀏覽器回退時是無害的,而POST會再次提交請求。
其實吧,GET和POST在本質(zhì)上沒有區(qū)別,都是HTTP協(xié)議中的兩種發(fā)送請求的方法。而HTTP呢,是基于TCP/IP的關(guān)于數(shù)據(jù)如何在萬維網(wǎng)中如何通信的協(xié)議。?
萬維網(wǎng):簡稱WWW,是World Wide Web的簡稱,也稱為Web、3W等。
HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。
GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數(shù),技術(shù)上是完全行的通的。?
舉個例子吧:
TCP就像汽車,我們用TCP來運輸數(shù)據(jù),它很可靠,從來不會發(fā)生丟件少件的現(xiàn)象。
但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統(tǒng)一定會癱瘓。
為了避免這種情況發(fā)生,交通規(guī)則HTTP誕生了。HTTP給汽車運輸設(shè)定了好幾個服務(wù)類別,包括GET, POST, PUT等等,
HTTP規(guī)定,當執(zhí)行GET請求的時候,要給汽車貼上GET的標簽(設(shè)置method為GET),而且要求把傳送的數(shù)據(jù)放在車頂上(url中)以方便記錄。
如果是POST請求,就要在車上貼上POST的標簽,并把貨物放在車廂里(request body中)。
HTTP只是個行為準則,而GET和POST本質(zhì)上就是TCP鏈接,并無差別。但是由于HTTP的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們在應(yīng)用過程中體現(xiàn)出一些不同。
URL中傳送參數(shù)的長度限制在Get和Post中都是怎么樣的呢?
?
不同的瀏覽器Client端(發(fā)起http請求)和服務(wù)器server端(接受http請求)就是不同的運輸公司。
雖然理論上,你可以在車頂上無限的堆貨物(url中無限加參數(shù))。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數(shù)據(jù)量太大對瀏覽器和服務(wù)器都是很大負擔。
業(yè)界不成文的規(guī)定是,(大多數(shù))瀏覽器通常都會限制url長度在2K個字節(jié),而(大多數(shù))服務(wù)器最多處理64K大小的url。
超過的部分,恕不處理。如果你用GET服務(wù),在request body偷偷藏了數(shù)據(jù),不同服務(wù)器的處理方式也是不同的,有些服務(wù)器會幫你卸貨,讀出數(shù)據(jù),有些服務(wù)器直接忽略。
那GET 方法參數(shù)寫法是固定的嗎?
在約定中,我們的參數(shù)是寫在 ? 后面,用 & 分割。如下:
http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2我們知道,解析報文的過程是通過獲取 TCP 數(shù)據(jù),用正則等工具從數(shù)據(jù)中獲取 Header 和 Body,從而提取參數(shù)。
比如header請求頭中添加token,來驗證用戶是否登錄等權(quán)限問題。
也就是說,我們可以自己約定參數(shù)的寫法,只要服務(wù)端能夠解釋出來就行,萬變不離其宗。
那么說來,是不是POST 方法比 GET 方法更安全呢?
有人說POST 比 GET 安全,因為數(shù)據(jù)在地址欄上不可見。
然而,從傳輸?shù)慕嵌葋碚f,他們都是不安全的,因為 HTTP 在網(wǎng)絡(luò)上是明文傳輸?shù)?#xff0c;只要在網(wǎng)絡(luò)節(jié)點上捉包,就能完整地獲取數(shù)據(jù)報文。
其實,要想安全傳輸,就只有加密,也就是 HTTPS。
你知道Get、Post請求發(fā)送的數(shù)據(jù)包有什么不同嗎?
GET請求時產(chǎn)生一個TCP數(shù)據(jù)包;POST請求時產(chǎn)生兩個TCP數(shù)據(jù)包。
- GET:瀏覽器會把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回數(shù)據(jù));
- POST:瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 OK(返回數(shù)據(jù))。
?POST需要兩步,理論上時間上消耗的要多一點,看起來GET比POST更有效。但并不是,后來發(fā)現(xiàn)原來是個坑。在我看來:
GET與POST都有自己的語義,不能隨便混用。
據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時間和發(fā)兩次包的時間差別基本可以無視。而在網(wǎng)絡(luò)環(huán)境差的情況下,兩次包的TCP在驗證數(shù)據(jù)包完整性上,有非常大的優(yōu)點。
并不是所有瀏覽器都會在POST中發(fā)送兩次包,Firefox就只發(fā)送一次。我去年用Chrome瀏覽器測試發(fā)現(xiàn)也是只發(fā)送一次,所以我認為Get、POST性能差可以人為忽略。
總結(jié)
以上是生活随笔為你收集整理的深入【Get】与【Post】区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【最爽的日期工具包LocalDate·超
- 下一篇: 蚂蚁呀嘿