GET与POST
估計(jì)大家的標(biāo)準(zhǔn)答案是以下這些:
并不是說(shuō)標(biāo)準(zhǔn)答案有誤,上述區(qū)別在大部分瀏覽器上是存在的,因?yàn)檫@些瀏覽器實(shí)現(xiàn)了 HTTP 標(biāo)準(zhǔn)。
然而從標(biāo)準(zhǔn)上看:從標(biāo)準(zhǔn)上來(lái)看,GET 和 POST 的區(qū)別如下:
- GET 用于獲取信息,是無(wú)副作用的,是冪等的,且可緩存
- POST 用于修改服務(wù)器上的數(shù)據(jù),有副作用,非冪等(所以谷歌有那個(gè)經(jīng)典的提示如下),不可緩存
但是將HTTP POST作為接口的形式使用時(shí)(AJAX技術(shù)等,當(dāng)成一種RPC協(xié)議使用),就沒(méi)有這種彈框了。于是把一個(gè)POST請(qǐng)求實(shí)現(xiàn)為冪等就有實(shí)際的意義。POST冪等能讓很多業(yè)務(wù)的前后端交互更順暢,以及避免一些因?yàn)榍岸薭ug,觸控失誤等帶來(lái)的重復(fù)提交。將一個(gè)有副作用的操作實(shí)現(xiàn)為冪等必須得從業(yè)務(wù)上能定義出怎么就算是“重復(fù)”。這樣萬(wàn)一用戶強(qiáng)行重復(fù)提交,服務(wù)器端可以做一次防護(hù)。
一、GET 和 POST 報(bào)文上的區(qū)別
GET 和 POST 方法沒(méi)有實(shí)質(zhì)區(qū)別,只是報(bào)文格式不同。
GET 和 POST 只是 HTTP 協(xié)議中兩種請(qǐng)求方式,而 HTTP 協(xié)議是基于 TCP/IP 的應(yīng)用層協(xié)議,無(wú)論 GET 還是 POST,用的都是同一個(gè)傳輸層協(xié)議,所以在傳輸上,沒(méi)有區(qū)別。
報(bào)文格式上:
不帶參數(shù)時(shí),最大區(qū)別就是第一行方法名不同。
- POST 方法請(qǐng)求報(bào)文第一行是這樣的 POST /uri HTTP/1.1 \r\n
- GET 方法請(qǐng)求報(bào)文第一行是這樣的 GET /uri HTTP/1.1 \r
帶參數(shù)時(shí)報(bào)文的區(qū)別如下: - GET 方法的參數(shù)應(yīng)該放在 url 中
- POST 方法參數(shù)應(yīng)該放在 body 中
舉個(gè)例子,如果參數(shù)是 name=a, age=22
//GET簡(jiǎn)約版報(bào)文: GET /index.php?name=a&age=22 HTTP/1.1 Host: localhost//POST簡(jiǎn)約版報(bào)文: POST /index.php HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded name=a&age=22兩種方法本質(zhì)上是 TCP 連接,沒(méi)有差別,也就是說(shuō),如果我不按規(guī)范來(lái)也是可以的。我們可以在 URL 上寫(xiě)參數(shù),然后方法使用 POST;也可以在 Body 寫(xiě)參數(shù),然后方法使用 GET。當(dāng)然,這需要服務(wù)端支持。所以,當(dāng)我們?cè)贏JAX等技術(shù)中使用POST/GET時(shí),就沒(méi)有瀏覽器中那么多限制了,只要是符合HTTP格式的就可以發(fā)。所以我們可以自定義了,并沒(méi)有什么限制說(shuō)GET一定不能沒(méi)有body,POST就一定不能把參放到<URL>的querystring上。因此其實(shí)可以更加自由的去利用格式。比如Elastic Search的_search api就用了帶body的GET。但是太自由也帶來(lái)了另一種麻煩,開(kāi)發(fā)人員不得不每次討論確定參數(shù)是放url的path里,querystring里,body里,header里這種問(wèn)題,太低效了。于是就有了一些列接口規(guī)范/風(fēng)格。其中名氣最大的當(dāng)屬REST。REST充分運(yùn)用GET、POST、PUT和DELETE,約定了這4個(gè)接口分別獲取、創(chuàng)建、替換和刪除“資源”,REST最佳實(shí)踐還推薦在請(qǐng)求體使用json格式。這樣僅僅通過(guò)看HTTP的method就可以明白接口是什么意思,并且解析格式也得到了統(tǒng)一。
二、POST 方法比 GET 方法安全嗎
一句話帶過(guò) ,從傳輸?shù)慕嵌葋?lái)說(shuō),他們都是不安全的,因?yàn)?HTTP 在網(wǎng)絡(luò)上是明文傳輸?shù)?#xff0c;只要在網(wǎng)絡(luò)節(jié)點(diǎn)上捉包,就能完整地獲取數(shù)據(jù)報(bào)文。要想安全傳輸,就只有加密,也就是 HTTPS。
三、GET方法的有長(zhǎng)度限制
HTTP 協(xié)議沒(méi)有 Body 和 URL 的長(zhǎng)度限制,對(duì) URL 限制的大多是瀏覽器和服務(wù)器的原因。服務(wù)器是因?yàn)樘幚黹L(zhǎng) URL 要消耗比較多的資源,為了性能和安全(防止惡意構(gòu)造長(zhǎng) URL 來(lái)攻擊)考慮,會(huì)給 URL 長(zhǎng)度加限制。url 長(zhǎng)度限制是某些瀏覽器和服務(wù)器的限制,和 HTTP 協(xié)議沒(méi)有關(guān)系。
四、POST 方法會(huì)產(chǎn)生兩個(gè) TCP 數(shù)據(jù)包?
有些文章為了標(biāo)新立異,強(qiáng)行講post 會(huì)將 header 和 body 分開(kāi)發(fā)送,先發(fā)送 header,服務(wù)端返回 100 狀態(tài)碼再發(fā)送 body。其實(shí),HTTP 協(xié)議中沒(méi)有明確說(shuō)明 POST 會(huì)產(chǎn)生兩個(gè) TCP 數(shù)據(jù)包,而且實(shí)際測(cè)試(Chrome)發(fā)現(xiàn),header 和 body 不會(huì)分開(kāi)發(fā)送。所以,header 和 body 分開(kāi)發(fā)送是部分瀏覽器或框架的請(qǐng)求方法,不屬于 post 必然行為。
本文有抄作業(yè)
本文有抄作業(yè)
總結(jié)
- 上一篇: java自定义注解解析及自定义注解
- 下一篇: 新版微信又来了