日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

網(wǎng)絡(luò)編程——Http請(qǐng)求方式Get與Post

作者:邊緣計(jì)算機(jī) 更新時(shí)間: 2022-04-12 編程語(yǔ)言

請(qǐng)求報(bào)文

請(qǐng)求行?
請(qǐng)求行由方法字段、URL 字段 和HTTP 協(xié)議版本字段 3 個(gè)部分組成,使用空格隔開。

常用的 HTTP 請(qǐng)求方法有 GET、POST。

GET

當(dāng)客戶端要從服務(wù)器中讀取某個(gè)資源時(shí),使用GET 方法。
GET 方法要求服務(wù)器將URL 定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶端,即向服務(wù)器請(qǐng)求某個(gè)資源。
使用GET方法時(shí),請(qǐng)求參數(shù)和對(duì)應(yīng)的值附加在 URL 后面,利用一個(gè)問號(hào)(“?”)代表URL 的結(jié)尾與請(qǐng)求參數(shù)的開始,傳遞參數(shù)長(zhǎng)度受限制,因此GET方法不適合用于上傳數(shù)據(jù)。
通過GET方法來獲取網(wǎng)頁(yè)時(shí),參數(shù)會(huì)顯示在瀏覽器地址欄上,因此保密性很差。

get請(qǐng)求報(bào)文例子:


GET / HTTP/1.1
Host: 192.168.110.10:9000
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive



POST

當(dāng)客戶端給服務(wù)器提供信息較多時(shí)可以使用POST 方法,POST 方法向服務(wù)器提交數(shù)據(jù),
比如完成表單數(shù)據(jù)的提交,將數(shù)據(jù)提交給服務(wù)器處理。

GET 用于獲取/查詢資源信息。POST 附帶用戶數(shù)據(jù),一般用于更新資源信息。
?

POST 方法將請(qǐng)求參數(shù)封裝在HTTP 請(qǐng)求數(shù)據(jù)中,而且長(zhǎng)度沒有限制,因?yàn)镻OST攜帶的數(shù)據(jù),在HTTP的請(qǐng)求正文中,以名稱/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù)。


POST /search HTTP/1.1 ?
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */* ?
Referer: http://www.baidu.cn
Accept-Language: zh-cn ?
Accept-Encoding: gzip, deflate ?
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) ?
Host:www.baidu.com
Connection: Keep-Alive ?
Cookie: PREF=ID=8tret43be9ae3c:U=treydfhgf5r4e65564td:NW=1:TM=5343434:?hl=zh-CN&source=hp&q=domety?


請(qǐng)求頭部為請(qǐng)求報(bào)文添加了一些附加信息,由“名/值”對(duì)組成,每行一對(duì),名和值之間使用冒號(hào)分隔。
請(qǐng)求頭部通知服務(wù)器有關(guān)于客戶端請(qǐng)求的信息,典型的請(qǐng)求頭有:

請(qǐng)求頭?? ?含義
User-Agent? ? ? ? ? ? ? ?請(qǐng)求的瀏覽器類型
Accept? ? ? ? ? ? ? ? ? ? ? 客戶端可識(shí)別的響應(yīng)內(nèi)容類型列表,星號(hào)“ * ”用于按范圍將類型分組,用“ / ”指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型
Accept-Language? ? ?客戶端可接受的自然語(yǔ)言
Accept-Encoding? ? ? 客戶端可接受的編碼壓縮格式
Accept-Charset? ? ? ? 可接受的應(yīng)答的字符集
Host? ? ? ? ? ? ? ? ? ? ? ? ?請(qǐng)求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP 地址,即虛擬主機(jī)
Connection? ? ? ? ? ? ??連接方式(close或keepalive)
Cookie? ? ? ? ? ? ? ? ? ? ?存儲(chǔ)于客戶端擴(kuò)展字段,向同一域名的服務(wù)端發(fā)送屬于該域的cookie


空行?
最后一個(gè)請(qǐng)求頭之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請(qǐng)求頭。

請(qǐng)求包體?body
請(qǐng)求包體不在GET方法中使用,而是POST方法中使用。?
POST方法適用于需要客戶填寫表單的場(chǎng)合。與請(qǐng)求包體相關(guān)的最常使用的是包體類型Content-Type和包體長(zhǎng)度Content-Length。

?

Get和Post的區(qū)別

GET請(qǐng)求的參數(shù)在URL里,通過URL傳遞,傳送的參數(shù)是有長(zhǎng)度限制的;而POST的參數(shù)不在URL里,參數(shù)放在放在Request body中,長(zhǎng)度不受限制。

GET請(qǐng)求的參數(shù)直接暴露在URL上,所以不能用來傳遞敏感的參數(shù)信息,比如密碼。

GET請(qǐng)求的URL,包括參數(shù)等信息,會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)在body中不會(huì)被保留。

GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式。

GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置。

GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。

GET在瀏覽器回退時(shí)是無害的,而POST會(huì)再次提交請(qǐng)求。

?

GET和POST本質(zhì)上沒有區(qū)別

HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,GET/POST都是TCP連接。

GET和POST能做的事情是一樣的。如果要給GET加上request body,給POST帶上url參數(shù),技術(shù)上是完全行的通的。?HTTP協(xié)議沒有要求,POST的參數(shù)一定要放到請(qǐng)求體body里面,GET的參數(shù)就一定要放到URL里面。而是由各種瀏覽器軟件的實(shí)現(xiàn),變成了現(xiàn)在的現(xiàn)象,GET要用URL傳參,POST用body傳參。當(dāng)然,可以給GET加上request body,給POST帶上url參數(shù),讓人覺得不規(guī)范。雖然GET可以帶request body,但不能保證一定能被服務(wù)器接收。不同服務(wù)器的處理方式是不同的,有些服務(wù)器會(huì)讀出數(shù)據(jù),有些服務(wù)器直接忽略。

HTTP規(guī)定,當(dāng)發(fā)起GET請(qǐng)求的時(shí)候,要在請(qǐng)求頭設(shè)置method為GET,而且要求把傳送的數(shù)據(jù)放在url中,以方便記錄。
發(fā)起POST請(qǐng)求,要在請(qǐng)求頭設(shè)置method為POST。

?

請(qǐng)求頭和請(qǐng)求體都沒有長(zhǎng)度的要求

HTTP協(xié)議明確了,請(qǐng)求頭和請(qǐng)求體都沒有長(zhǎng)度的要求。

而對(duì)URL長(zhǎng)度上的限制,是別的兩個(gè)的原因造成的:

大多數(shù)瀏覽器會(huì)限制url長(zhǎng)度在2K個(gè)字節(jié),而大多數(shù)服務(wù)器最多處理64K大小的url。

1、瀏覽器

超過的部分不處理。據(jù)說IE對(duì)URL長(zhǎng)度會(huì)限制在2048個(gè)字符內(nèi)。但是就我所知,firefox是支持10W以上的長(zhǎng)度。

2、服務(wù)器

服務(wù)器處理超長(zhǎng)的URL,就是一種負(fù)擔(dān)。

因此,多數(shù)服務(wù)器出于安全、穩(wěn)定等多方面的考慮,會(huì)給URL長(zhǎng)度加限制。但是這個(gè)限制是針對(duì)所有HTTP請(qǐng)求的,與GET、POST沒有關(guān)系。

?

?

GET和POST的重大區(qū)別

GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。

  • 對(duì)于Get請(qǐng)求,瀏覽器會(huì)把GET請(qǐng)求的header和data一起發(fā)送出去,服務(wù)器響應(yīng)返回?cái)?shù)據(jù);
  • 對(duì)于POST請(qǐng)求, 瀏覽器先發(fā)送請(qǐng)求header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送請(qǐng)求data,服務(wù)器響應(yīng)返回完整的數(shù)據(jù)。

實(shí)際上,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時(shí)間和發(fā)兩次包的時(shí)間差微乎其微,可以忽略。而在網(wǎng)絡(luò)環(huán)境差的情況下,發(fā)送兩次包的TCP,在驗(yàn)證數(shù)據(jù)包完整性上,有非常大的優(yōu)點(diǎn)。

100 Continue:服務(wù)器僅接收到部分請(qǐng)求,但是一旦服務(wù)器并沒有拒絕該請(qǐng)求,客戶端應(yīng)該繼續(xù)發(fā)送其余的請(qǐng)求。

服務(wù)器第一次返回的?100 continue header報(bào)文,是由客戶端對(duì)http的post和get的請(qǐng)求策略決定的,目的是為了避免浪費(fèi)資源,節(jié)省帶寬,數(shù)據(jù)傳輸消耗的時(shí)間等。只是客戶端的post請(qǐng)求會(huì)在發(fā)送header的時(shí)候添加expect 100去探探路,如果失敗了就不用繼續(xù)發(fā)送data,從而減少了資源的浪費(fèi)。所以是否在發(fā)送一個(gè)包取決了客戶端的實(shí)現(xiàn)策略,和get/post并沒有關(guān)系。有的客戶端瀏覽器fireFox就只發(fā)送一個(gè)包。

?

Get和Post請(qǐng)求的本質(zhì)上都是建立TCP連接,而無差別。

只是由于HTTP的規(guī)定和瀏覽器、服務(wù)器的限制,導(dǎo)致他們?cè)趹?yīng)用過程中表現(xiàn)出一些不同。

?

?

?

原文鏈接:https://blog.csdn.net/panjunnn/article/details/108668745

欄目分類
最近更新