GET和POST的區(qū)別
HTTP請求方法
說GET和POST之前就先來看一下什么是HTTP吧。
超文本傳輸協(xié)議(HTTP)的設(shè)計目的是保證客戶機與服務(wù)器之間的通信。
HTTP 的工作方式是客戶機與服務(wù)器之間的請求-應(yīng)答協(xié)議糜芳。
web 瀏覽器可能是客戶端蚣抗,而計算機上的網(wǎng)絡(luò)應(yīng)用程序也可能作為服務(wù)器端带膜。
舉例:客戶端(瀏覽器)向服務(wù)器提交HTTP請求;服務(wù)器向客戶端返回響應(yīng)术徊。響應(yīng)包含關(guān)于請求的狀態(tài)信息以及可能被請求的內(nèi)容。
HTTP的請求方法有以下的八種:
1\. GET 向服務(wù)器獲取指定資源
2\. HEAD 與GET一致鲸湃,只不過響應(yīng)體不返回赠涮,只返回響應(yīng)頭
3\. POST 向服務(wù)器提交數(shù)據(jù),數(shù)據(jù)放在請求體里
4\. PUT 與POST相似暗挑,只是具有冪等(注1)特性笋除,一般用于更新
5\. DELETE 刪除服務(wù)器指定資源
6\. TRACE 回顯服務(wù)器端收到的請求,測試的時候會用到這個
7\. CONNECT 預(yù)留炸裆,暫無使用
8\. OPTIONS 返回服務(wù)器所支持的請求方法
以上內(nèi)容來自w3cschool
所以從上數(shù)據(jù)可以看出:
- GET 用于獲取信息垃它,是無副作用的,是冪等的,且可緩存
2. POST 用于修改服務(wù)器上的數(shù)據(jù)国拇,有副作用洛史,非冪等,不可緩存
隨便一個計算機從業(yè)人員都可以說出一些他們的區(qū)別酱吝,例如:
1. GET方法用于信息獲取虹菲,它是安全的(安全:指非修改信息,如數(shù)據(jù)庫方面的信息)掉瞳,而POST方法是用于修改服務(wù)器上資源的請求毕源;
2. GET請求的數(shù)據(jù)會附在URL之后,而POST方法提交的數(shù)據(jù)則放置在HTTP報文實體的主體里陕习,所以POST方法的安全性比GET方法要高霎褐;
3. GET方法傳輸?shù)臄?shù)據(jù)量一般限制在2KB,其原因在于:GET是通過URL提交數(shù)據(jù)该镣,而URL本身對于數(shù)據(jù)沒有限制冻璃,但是不同的瀏覽器對于URL是有限制的,比如IE瀏覽器對于URL的限制為2KB损合,而Chrome省艳,F(xiàn)ireFox瀏覽器理論上對于URL是沒有限制的,它真正的限制取決于操作系統(tǒng)本身嫁审;POST方法對于數(shù)據(jù)大小是無限制的跋炕,真正影響到數(shù)據(jù)大小的是服務(wù)器處理程序的能力。
本質(zhì)上律适,GET和POST是沒有區(qū)別的辐烂,他們都是http協(xié)議中的兩種發(fā)送請求的方法,而http是基于TCP/IP的關(guān)于數(shù)據(jù)如何在萬維網(wǎng)中通信的協(xié)議
HTTP的底層是TCP/IP捂贿。所以GET和POST的底層也是TCP/IP纠修,也就是說,GET/POST都是TCP鏈接厂僧。你要給GET加上request body扣草,給POST帶上url參數(shù),技術(shù)上是完全行的通的颜屠。
再來看看HTTP報文
報文格式上辰妙,不帶參數(shù)時,最大區(qū)別就是第一行方法名不同POST方法請求報文第一行是這樣的
POST /uri HTTP/1.1 \r\n
GET方法請求報文第一行是這樣的
GET /uri HTTP/1.1 \r\n
是的汽纤,不帶參數(shù)時他們的區(qū)別就僅僅是報文的前幾個字符不同而已帶參數(shù)時報文的區(qū)別呢上岗? 在約定中,GET 方法的參數(shù)應(yīng)該放在 url 中蕴坪,POST 方法參數(shù)應(yīng)該放在 body 中舉個例子肴掷,如果參數(shù)是 name=qiming.c, age=22敬锐。GET 方法簡約版報文是這樣的
GET /index.php?name=qiming.c&age=22 HTTP/1.1
Host: localhost
POST 方法簡約版報文是這樣的
POST /index.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=qiming.c&age=22
POST 方法會產(chǎn)生兩個TCP數(shù)據(jù)包?
有些文章中提到呆瞻,post 會將 header 和 body 分開發(fā)送台夺,先發(fā)送 header,服務(wù)端返回 100 狀態(tài)碼再發(fā)送 body痴脾。
HTTP 協(xié)議中沒有明確說明 POST 會產(chǎn)生兩個 TCP 數(shù)據(jù)包颤介,而且實際測試(Chrome)發(fā)現(xiàn),header 和 body 不會分開發(fā)送赞赖。
所以滚朵,header 和 body 分開發(fā)送是部分瀏覽器或框架的請求方法,不屬于 post 必然行為前域。
注釋
1. 冪等 在編程中一個冪等操作的特點是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同辕近。冪等函數(shù),或冪等方法匿垄,是指可以使用相同參數(shù)重復(fù)執(zhí)行移宅,并能獲得相同結(jié)果的函數(shù)。這些函數(shù)不會影響系統(tǒng)狀態(tài)椿疗,也不用擔(dān)心重復(fù)執(zhí)行會對系統(tǒng)造成改變漏峰。例如,“setTrue()”函數(shù)就是一個冪等函數(shù),無論多次執(zhí)行届榄,其結(jié)果都是一樣的.更復(fù)雜的操作冪等保證是利用唯一交易號(流水號)實現(xiàn).