網(wǎng)站首頁(yè) 編程語(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
相關(guān)推薦
- 2023-12-26 layui彈窗傳值
- 2022-09-07 Jquery實(shí)現(xiàn)異步上傳文件_jquery
- 2023-02-01 Bat腳本之在文件中查找多個(gè)字符串并保存到文件中_DOS/BAT
- 2023-04-18 C++超詳細(xì)分析優(yōu)化排序算法之堆排序_C 語(yǔ)言
- 2022-05-21 C語(yǔ)言實(shí)現(xiàn)會(huì)員管理系統(tǒng)_C 語(yǔ)言
- 2023-03-25 React高階組件使用詳細(xì)介紹_React
- 2022-08-17 python運(yùn)行腳本文件的三種方法實(shí)例_python
- 2024-01-31 linux下查看文件當(dāng)下的所有文件的大小和查找大文件
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支