Http请求方法之Get、Post原理
什么是HTTP?
HTTP,即超文本傳輸協(xié)議,是一種實(shí)現(xiàn)客戶端和服務(wù)器之間通信的響應(yīng)協(xié)議,它是用作客戶端和服務(wù)器之間的請(qǐng)求。
客戶端(瀏覽器)會(huì)向服務(wù)器提交HTTP請(qǐng)求;然后服務(wù)器向客戶端返回響應(yīng);其中響應(yīng)包含有關(guān)請(qǐng)求的狀態(tài)信息,還可能包含請(qǐng)求的內(nèi)容。
HTTP的常用方法
1、GET方法
GET方法用于使用給定的URI從給定服務(wù)器中檢索信息,即從指定資源中請(qǐng)求數(shù)據(jù)。使用GET方法的請(qǐng)求應(yīng)該只是檢索數(shù)據(jù),并且不應(yīng)對(duì)數(shù)據(jù)產(chǎn)生其他影響。
在GET請(qǐng)求的URL中發(fā)送查詢字符串(名稱/值對(duì)),需要這樣寫:/test/demo_form.php?name1=value1&name2=value2
說(shuō)明:GET請(qǐng)求是可以緩存的,我們可以從瀏覽器歷史記錄中查找到GET請(qǐng)求,還可以把它收藏到書簽中;且GET請(qǐng)求有長(zhǎng)度限制,僅用于請(qǐng)求數(shù)據(jù)(不修改)。
注:因GET請(qǐng)求的不安全性,在處理敏感數(shù)據(jù)時(shí),絕不可以使用GET請(qǐng)求。
2、POST方法
POST方法用于將數(shù)據(jù)發(fā)送到服務(wù)器以創(chuàng)建或更新資源,它要求服務(wù)器確認(rèn)請(qǐng)求中包含的內(nèi)容作為由URI區(qū)分的Web資源的另一個(gè)下屬。
POST請(qǐng)求永遠(yuǎn)不會(huì)被緩存,且對(duì)數(shù)據(jù)長(zhǎng)度沒(méi)有限制;我們無(wú)法從瀏覽器歷史記錄中查找到POST請(qǐng)求。
3、HEAD方法
HEAD方法與GET方法相同,但沒(méi)有響應(yīng)體,僅傳輸狀態(tài)行和標(biāo)題部分。這對(duì)于恢復(fù)相應(yīng)頭部編寫的元數(shù)據(jù)非常有用,而無(wú)需傳輸整個(gè)內(nèi)容。
4、PUT方法
PUT方法用于將數(shù)據(jù)發(fā)送到服務(wù)器以創(chuàng)建或更新資源,它可以用上傳的內(nèi)容替換目標(biāo)資源中的所有當(dāng)前內(nèi)容。
它會(huì)將包含的元素放在所提供的URI下,如果URI指示的是當(dāng)前資源,則會(huì)被改變。如果URI未指示當(dāng)前資源,則服務(wù)器可以使用該URI創(chuàng)建資源。
5、DELETE方法
DELETE方法用來(lái)刪除指定的資源,它會(huì)刪除URI給出的目標(biāo)資源的所有當(dāng)前內(nèi)容。
6、CONNECT方法
CONNECT方法用來(lái)建立到給定URI標(biāo)識(shí)的服務(wù)器的隧道;它通過(guò)簡(jiǎn)單的TCP / IP隧道更改請(qǐng)求連接,通常實(shí)使用解碼的HTTP代理來(lái)進(jìn)行SSL編碼的通信(HTTPS)。
7、OPTIONS方法
OPTIONS方法用來(lái)描述了目標(biāo)資源的通信選項(xiàng),會(huì)返回服務(wù)器支持預(yù)定義URL的HTTP策略。
8、TRACE方法
TRACE方法用于沿著目標(biāo)資源的路徑執(zhí)行消息環(huán)回測(cè)試;它回應(yīng)收到的請(qǐng)求,以便客戶可以看到中間服務(wù)器進(jìn)行了哪些(假設(shè)任何)進(jìn)度或增量。
GET和POST請(qǐng)求都有哪些區(qū)別:
GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST沒(méi)有。
GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息。而POST數(shù)據(jù)不會(huì)顯示在URL中。是放在Request body中。
對(duì)參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符,而POST沒(méi)有限制。
GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里;相反,POST請(qǐng)求參數(shù)也不會(huì)被瀏覽器保留。
GET請(qǐng)求只能進(jìn)行url編碼(application/x-www-form-urlencoded),而POST支持多種編碼方式。
GET請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存,而POST不會(huì),除非手動(dòng)設(shè)置。
GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求。
Get請(qǐng)求有Request body么?如果有的話參數(shù)可以像Post請(qǐng)求一樣放在里面么?
HTTP只是個(gè)行為準(zhǔn)則,而GET和POST本質(zhì)上就是TCP鏈接,并無(wú)差別。但是由于HTTP的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們?cè)趹?yīng)用過(guò)程中體現(xiàn)出一些不同。
如果給GET加上request body,給POST帶上url參數(shù),技術(shù)上是完全行的通的。
如果你用GET服務(wù),在request body偷偷藏了數(shù)據(jù),不同服務(wù)器的處理方式也是不同的,有些服務(wù)器會(huì)幫你讀出數(shù)據(jù),有些服務(wù)器直接忽略。所以,雖然GET可以帶request body,卻不能保證一定能被接收到。
URL中傳送參數(shù)的長(zhǎng)度限制在Get和Post中都是怎么樣的呢?
業(yè)界不成文的規(guī)定是,(大多數(shù))瀏覽器通常都會(huì)限制url長(zhǎng)度在2K個(gè)字節(jié),而(大多數(shù))服務(wù)器最多處理64K大小的url,超過(guò)的部分,恕不處理。如果你用GET服務(wù),在request body偷偷藏了數(shù)據(jù),不同服務(wù)器的處理方式也是不同的,有些服務(wù)器會(huì)幫你卸貨,讀出數(shù)據(jù),有些服務(wù)器直接忽略。
所以,雖然GET可以帶request body,卻不能保證一定能被接收到
那GET 方法參數(shù)寫法是固定的嗎?
在約定中,我們的參數(shù)是寫在 ? 后面,用 & 分割。如下:http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2
我們知道,解析報(bào)文的過(guò)程是通過(guò)獲取 TCP 數(shù)據(jù),用正則等工具從數(shù)據(jù)中獲取 Header 和 Body,從而提取參數(shù)。
比如header請(qǐng)求頭中添加token,來(lái)驗(yàn)證用戶是否登錄等權(quán)限問(wèn)題。
也就是說(shuō),我們可以自己約定參數(shù)的寫法,只要服務(wù)端能夠解釋出來(lái)就行,萬(wàn)變不離其宗。
有人說(shuō)POST 比 GET 安全,因?yàn)閿?shù)據(jù)在地址欄上不可見(jiàn)
從傳輸?shù)慕嵌葋?lái)說(shuō),他們都是不安全的,因?yàn)?HTTP 在網(wǎng)絡(luò)上是明文傳輸?shù)模灰诰W(wǎng)絡(luò)節(jié)點(diǎn)上捉包,就能完整地獲取數(shù)據(jù)報(bào)文。
其實(shí),要想安全傳輸,就只有加密,也就是 HTTPS。
Get、Post請(qǐng)求發(fā)送的數(shù)據(jù)包有什么不同嗎?
GET請(qǐng)求時(shí)產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST請(qǐng)求時(shí)產(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ù))
因?yàn)镻OST需要兩步,理論上時(shí)間上消耗的要多一點(diǎn),看起來(lái)GET比POST更有效,但并不是。
GET與POST都有自己的語(yǔ)義,不能隨便混用。
據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時(shí)間和發(fā)兩次包的時(shí)間差別基本可以無(wú)視。而在網(wǎng)絡(luò)環(huán)境差的情況下,兩次包的TCP在驗(yàn)證數(shù)據(jù)包完整性上,有非常大的優(yōu)點(diǎn)。
并不是所有瀏覽器都會(huì)在POST中發(fā)送兩次包,F(xiàn)irefox就只發(fā)送一次。我去年用Chrome瀏覽器測(cè)試發(fā)現(xiàn)也是只發(fā)送一次,所以我認(rèn)為Get、POST性能差可以人為忽略。
總結(jié)
以上是生活随笔為你收集整理的Http请求方法之Get、Post原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: plc控制可调节阀流程图_PLC控制的水
- 下一篇: 算法分析基础——迭代法求解递推方程