主要梳理下簡單的HTTP協(xié)議的基礎(chǔ)知識逐抑,供大家參考
HTTP是什么
URI vs URL
uri: uniform resource identifier統(tǒng)一資源標(biāo)識符
url: uniform resource locator統(tǒng)一資源定位符束凑,是通過web瀏覽器訪問資源的
urn: uniform resource name渗钉,統(tǒng)一資源命名瞒瘸,是通過名字來標(biāo)識資源
HTTP是無狀態(tài)的双戳,如何保存狀態(tài)戏蔑?
url帶查詢參數(shù)
cookie
HTTP有哪些方法
GET: 用來請求訪問已被URI識別的資源
POST: 用來傳輸實(shí)體的主體
PUT: 用來傳輸文件
HEAD: 獲取報文首部叹洲,不返回報文主體部分
DELETE:刪除文件
OPTIONS: 詢問支持的方法
TRACE:追蹤路徑
CONNECT:要求用隧道協(xié)議鏈接代理
持久連接 keep-alive
只要任意一端沒有明確提出斷開連接柠硕,則保持TCP連接狀態(tài)
管線化:并發(fā)請求
HTTP報文
用于HTTP協(xié)議交互的信息被稱為HTTP報文
請求端的HTTP報文叫做請求報文,響應(yīng)端的叫做響應(yīng)報文疹味。HTTP報文本身是由多行(用CR[Carriage Return,回車符:16進(jìn)制0x0d]+LF[Line Feed,換行符:16進(jìn)制0x0a]作換行符)數(shù)據(jù)構(gòu)成的字符串文本仅叫。
1,請求報文和響應(yīng)報文的結(jié)構(gòu)
ps:一般4種首部:通用首部、請求首部糙捺、響應(yīng)首部和實(shí)體首部
常用的內(nèi)容編碼:
gzip(GUN zip) compress(UNIX系統(tǒng)的標(biāo)準(zhǔn)壓縮)deflate(zlib)identity(不進(jìn)行編碼)
2,分割發(fā)送的分塊傳輸編碼
HTTP/1.1中存在一種稱為傳輸編碼(Transfer Coding)的機(jī)制诫咱,可以在通信時按某種編碼方式傳輸,但只定義作用于分塊傳輸編碼中洪灯。
發(fā)送多種數(shù)據(jù)的多部分對象集合(multipart)
MIME(Multipurpose Internet Mail Extensions坎缭,多用途因特網(wǎng)郵件擴(kuò)展),允許郵件處理文本签钩、圖片掏呼、視頻等多個不同類型的數(shù)據(jù)。
多部分對象集合包含的對象如下:
- multipart/form-data
在Web表單文件上傳時使用
- multipart/byteranges
狀態(tài)碼206(Partial Content,部分內(nèi)容)響應(yīng)報文包含多個范圍的內(nèi)容時使用铅檩。
HTTP狀態(tài)碼
狀態(tài)碼詳解
- 2XX 成功
200 OK
204 No Content 一般在只需要從客戶端往服務(wù)器發(fā)送信息憎夷,而對客戶端不需要發(fā)送新消息內(nèi)容的情況下使用
206 Partial Content 該狀態(tài)碼表示客戶端進(jìn)行了范圍請求,而服務(wù)器成功執(zhí)行了這部分的GET請求昧旨。響應(yīng)報文中包含由Content-Range指定范圍的實(shí)體內(nèi)容拾给。
3XX重定向
301 Moved Permanently 永久性重定向祥得。
好處:
1,沒有網(wǎng)址規(guī)范化問題:當(dāng)有幾個不同的URL指向同一個頁面時蒋得,告訴搜索引擎哪個URL才是你想要
2级及,SEO(搜索引擎優(yōu)化)中提到一點(diǎn):如果我們把一個地址采用301跳轉(zhuǎn)方式跳轉(zhuǎn)的話,搜索引擎會把老地址的PageRank等信息帶到新地址额衙,同時在搜索引擎索引庫中徹底廢棄掉原先的老地址饮焦。302 Found 臨時性重定向。
SPAM(搜索引擎垃圾技術(shù))303 See Other窍侧,表示由于請求對應(yīng)的資源存在另一個URI县踢,應(yīng)使用GET方法定向獲取請求的資源。
PS:
1)當(dāng)301疏之、302殿雪、303響應(yīng)狀態(tài)碼返回時,幾乎所有的瀏覽器都會把POST改成GET,并刪除請求報文內(nèi)的主體锋爪,之后請求會自動再次發(fā)送
2)301丙曙、302標(biāo)準(zhǔn)是禁止將POST方法改變成GET方法的,但實(shí)際使用時大家都會這么做其骄。304 Not Modified
307 Temporary Redirect 會遵照瀏覽器標(biāo)準(zhǔn)亏镰,不會從POST變成GET。
個人理解:協(xié)議中這么多很多類似的跳轉(zhuǎn)拯爽,302現(xiàn)在被大量使用索抓,http1.1出現(xiàn)了303&307,應(yīng)該是對302的細(xì)分出兩個新的狀態(tài)碼毯炮,出發(fā)點(diǎn)是想讓303&307替代302逼肯,但是現(xiàn)實(shí)是很多項目都是使用302。還有一點(diǎn)POST重定向的場景是否很多桃煎。4XX客戶端錯誤:4xx的響應(yīng)結(jié)果表明客戶端是發(fā)生錯誤的原因所在
400 Bad Request
表示請求報文中存在語法錯誤篮幢。401 Unauthorized 表示發(fā)送的請求需要有通過HTTP認(rèn)證(BASIC認(rèn)證、DIGEST認(rèn)證)的認(rèn)證信息
403 Forbidden 表明對請求資源的訪問被服務(wù)器拒絕
404 Not Found 表明服務(wù)器上無法找到請求資源
5XX服務(wù)器錯誤 表明服務(wù)器本身發(fā)生錯誤
500 Internal Server Error 表明服務(wù)器端在執(zhí)行請求時發(fā)生了錯誤
503 Service Unavailable 表明服務(wù)器暫時處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù)为迈,現(xiàn)在無法處理請求三椿。如果事先得知解除以上狀況需要的時間,最好寫入Retry-After首部字段再返回給客戶端
PS:狀態(tài)碼和狀況的不一致時葫辐,需要前后端把響應(yīng)情況都要提前自定義好搜锰。如果是返回頁面,最好做攔截耿战,不要直接返回沒有任何樣式的響應(yīng)蛋叼。比如我們的404頁面和500頁面
與http協(xié)作的WEB服務(wù)器
代理、緩存代理
HTTP 首部
首部字段結(jié)構(gòu): 首部字段名: 字段值
PS:HTTP首部字段重復(fù)了剂陡,這種情況是根據(jù)瀏覽器內(nèi)部處理邏輯的不同鸦列,結(jié)果可能并不一致租冠。有的是優(yōu)先處理第一次出現(xiàn)的首部字段鹏倘,有的則會優(yōu)先處理最后出現(xiàn)的首部字段薯嗤。故要盡量不要重復(fù)
- 4種HTTP首部字段類型
1)通用首部字段(General Header Fields)
請求報文和響應(yīng)報文兩方都會使用的首部
2)請求首部字段(Request Header Fields)
從客戶端向服務(wù)器端發(fā)送請求報文時使用的首部。
3)響應(yīng)首部字段(Response Header Fields)
從服務(wù)器端向客戶端返回響應(yīng)報文時使用的首部
4)實(shí)體首部字段(Entity Header Fields)
針對請求報文和響應(yīng)報文的實(shí)體部分使用的首部
HTTP/1.1規(guī)范定義了如下47種首部字段
通用首部字段:請求報文和響應(yīng)報文雙方都會使用的首部
請求首部字段
響應(yīng)首部字段
實(shí)體首部字段
主要說明下控制緩存的首部字段的區(qū)別:
1纤泵,Cache-Control
Cache-Control: private, max-age=0, no-cache
緩存請求指令
緩存響應(yīng)指令
表示是否能緩存的指令:
1)public:表明其他用戶也可利用緩存
2)private:響應(yīng)只以特定的用戶作為對象
3)no-cache:為了防止從緩存中返回過期的資源骆姐。表示客戶端將不會接收緩存過的響應(yīng)
4)no-store:暗示請求(和對應(yīng)的響應(yīng))或響應(yīng)中包含機(jī)密信息。該指令規(guī)定緩存不能在本地存儲請求或響應(yīng)的任一部分捏题。
PS:從字面意思看很容易把no-cache誤解成為不緩存玻褪,但事實(shí)上no-cache代表不緩存過期的資源,緩存會想服務(wù)器進(jìn)行有效期確認(rèn)后處理資源公荧,也許稱為do-not-server-from-cache-without-revalidation更合適带射。no-store才是真正地不進(jìn)行緩存,注意區(qū)別
5)s-maxage:功能和max-age指令相同循狰,不同點(diǎn)在于窟社,s-maxage指令只適用于供多位用戶使用的公共緩存服務(wù)器。即绪钥,對于向同一用戶重復(fù)返回響應(yīng)的服務(wù)器來說灿里,這個指令沒有任何作用。當(dāng)使用s-maxage指令后程腹,則直接忽略對Expires首部字段及max-age指令的處理
6)max-age:判定緩存資源的緩存時間數(shù)值比制定時間的數(shù)值更小匣吊,則客戶端就接收緩存的資源。如果max-age值為0寸潦,那么緩存服務(wù)器通常需要將請求轉(zhuǎn)發(fā)給源服務(wù)器色鸳。如果同時存在Expires首部字段的情況時,會優(yōu)先處理max-age指令见转,而忽略掉Expires首部字段命雀,1.0版本相反。
2池户,Pragma是http/1.1之前版本的歷史遺留字段咏雌,僅作為與http/1.0的向后兼容而定義。
Cache-Control: no-cache
Pragma: no-cache
3校焦,ETag:告知客戶端實(shí)體標(biāo)識赊抖。它是一種可將資源以字符串形式做唯一性標(biāo)識的方式。服務(wù)器會為每份資源分配對應(yīng)的ETag值寨典。
強(qiáng)ETag值氛雪,不論實(shí)體發(fā)生多么細(xì)微的變化都會改變其值
弱ETag值,只用于提示資源是否相同耸成。只有資源發(fā)生了根本改變报亩,產(chǎn)生差異時才會改變浴鸿。會在字段最開始處加W/。例:ETag: W/"usagi-1234"
配合使用首部:
If-Match
If-None-Match
If-Range
4弦追,If-xxx這種樣式的請求首部字段岳链,稱為條件請求。
If-Modified-Since
If-Unmodified-Since
If-Range:告知服務(wù)器若指定的If-Range字段值(ETag值或時間)和請求資源的ETag值或時間相一致時劲件,則作為范圍請求處理掸哑。反之,則返回全體資源
5,Expires:將資源失效的日期告知客戶端零远。
6,Last-Modified