HTTP報(bào)文結(jié)構(gòu)
下圖是一個(gè)完整的HTTP報(bào)文的形式,一共分為三層:
- 報(bào)文首部: 提供HTTP報(bào)文的信息猎拨,規(guī)定通信雙方所遵循的一些規(guī)則糊昙,請(qǐng)求報(bào)文和響應(yīng)報(bào)文的首部的關(guān)鍵字是不一樣的;
- 空格:用來(lái)區(qū)分報(bào)文首部與報(bào)文主體鹤盒;
- 報(bào)文主體:通信的實(shí)質(zhì)性內(nèi)容百炬,如:客戶端向服務(wù)器的請(qǐng)求內(nèi)容褐隆,服務(wù)器向客戶端的響應(yīng)內(nèi)容,也可以沒(méi)有內(nèi)容剖踊;
編碼
HTTP在傳輸過(guò)程中可以按照數(shù)據(jù)的原樣直接傳播庶弃,也能夠通過(guò)編碼壓縮的方式來(lái)提升傳輸速率。當(dāng)然德澈,在提升速率的同時(shí)是需要消耗一部分CPU的性能來(lái)進(jìn)行壓縮歇攻。
- 報(bào)文(message):是HTTP通信中的基本單位,由8位組字節(jié)流組成梆造,通過(guò)HTTP通信傳輸缴守。
- 實(shí)體(enity):作為請(qǐng)求或響應(yīng)的有效載荷數(shù)據(jù)被傳輸, 其內(nèi)容由實(shí)體首部和實(shí)體主體構(gòu)成镇辉。
通常來(lái)說(shuō)報(bào)文和實(shí)體是沒(méi)有區(qū)別的屡穗,但是當(dāng)傳輸過(guò)程中進(jìn)行編碼操作后,傳輸?shù)闹黧w便由報(bào)文變成了實(shí)體忽肛〈迳埃客戶端、服務(wù)器雙方約定相同的編碼形式屹逛,就可以對(duì)報(bào)文進(jìn)行解壓縮了础废。常用的內(nèi)容編碼有如下幾種:
- gzip(GNU zip)
- compress(UNIX系統(tǒng)的標(biāo)準(zhǔn)壓縮)
- deflate(zlib)
- identify(不進(jìn)行編碼)
HTTP的請(qǐng)求方法
-
GET
:獲取資源汛骂,請(qǐng)求訪問(wèn)已被URI識(shí)別的資源。 -
POST
:POST
和GET
的方法很相似色迂,但是其主要目的是傳輸實(shí)體香缺,也就是用于傳遞大量數(shù)據(jù)至服務(wù)器的方法手销。 -
PUT
:傳輸文件歇僧,如同F(xiàn)TP協(xié)議中上傳文件的方式一樣,要求在請(qǐng)求報(bào)文主體部分包含文件內(nèi)容锋拖,保存至請(qǐng)求URI指定的位置诈悍,由于本身不帶驗(yàn)證機(jī)制,導(dǎo)致無(wú)法保證服務(wù)器的安全性兽埃,基本上都是被禁用的侥钳。 -
DELETE
:刪除文件,PUT
的逆操作柄错。同PUT
一樣舷夺,由于沒(méi)有驗(yàn)證機(jī)制,故基本上被禁用售貌。 -
HEAD
:GET操作的閹割版给猾,只返回報(bào)文首部,不返回報(bào)文主體颂跨。 -
OPTIONS
:查詢針對(duì)請(qǐng)求URI指定資源支持的方法敢伸。假若目標(biāo)URI支持GET
,POST
,OPTION
,HEAD
,則響應(yīng)報(bào)文中會(huì)出現(xiàn):Allow:GET,POST,OPTION,HEAD
恒削; -
TRACE
:讓服務(wù)器端將請(qǐng)求通信環(huán)返回給客戶端的方法池颈。客戶端與服務(wù)器之間可能存在若干個(gè)代理或是網(wǎng)關(guān)钓丰,通過(guò)TRACE
方法可以追蹤請(qǐng)求報(bào)文所經(jīng)過(guò)的路徑躯砰,查詢請(qǐng)求是怎樣被修改(或是篡改)的,但因?yàn)門RACE方法容易引發(fā)跨站追蹤携丁,所以也不常用弃揽。 -
CONNECT
:要求在與代理服務(wù)器通信時(shí)建立隧道,常與SSL或TLS一起包裝使用则北,也就是HTTPS矿微。
HTTP狀態(tài)碼
在所有的響應(yīng)報(bào)文首部會(huì)借助狀態(tài)碼來(lái)告訴服務(wù)端對(duì)本次請(qǐng)求的處理結(jié)果,狀態(tài)碼以3位數(shù)字和原因短語(yǔ)構(gòu)成尚揣。第一位數(shù)字代表了響應(yīng)類別涌矢,第二位,第三位只有占位的意義:
狀態(tài)碼一共大概有60多種快骗,但常用的大概只有14種娜庇,接下來(lái)依次介紹:
-
200 OK
:這是最希望看到的結(jié)果塔次,表示服務(wù)器已經(jīng)成功處理了客戶端的請(qǐng)求并作出了正確的響應(yīng)。 -
204 Not Content
:表示服務(wù)器已成功處理客戶端的請(qǐng)求名秀,但響應(yīng)報(bào)文中不含實(shí)體的主體部分励负,也不允許返回實(shí)體主體。 -
206 Partial Content
:表示客戶端進(jìn)行了范圍請(qǐng)求匕得,服務(wù)器也成功的執(zhí)行了這部分的GET請(qǐng)求继榆。響應(yīng)報(bào)文中包含了Content-Range來(lái)表明返回實(shí)體主體的范圍。 -
301 Moved Permanently
:永久重定向汁掠,表明該資源已經(jīng)被分配了新的URI略吨,輸入老URI會(huì)自動(dòng)跳轉(zhuǎn)至新URI。 -
302 Found
:臨時(shí)重定向考阱,也表明該資源被分配了新的URI翠忠,但新的URI也可能發(fā)生改變。 -
303 See Other
:與302一樣乞榨,但多了一個(gè)限定條件秽之,要求客戶端能用GET方法來(lái)獲取資源。
PS:實(shí)際上301,302,303響應(yīng)狀態(tài)碼返回時(shí)吃既,所有的瀏覽器都會(huì)將POST改為GET考榨,并刪除請(qǐng)求報(bào)文的主體。 -
304 Not Modified
: 該狀態(tài)碼表示客戶端附帶條件請(qǐng)求(帶有IF的首部字段)時(shí)态秧,未滿足條件時(shí)董虱,服務(wù)器卻允許訪問(wèn)資源的情況。304狀態(tài)碼返回時(shí)申鱼,不包含任何實(shí)體主體部分愤诱。當(dāng)我們?yōu)g覽緩存時(shí),常尘栌眩看到304狀態(tài)碼淫半。 -
400 Bad Request
:請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤。 -
401 Unauthorized·
:表示該請(qǐng)求需要通過(guò)HTTP認(rèn)證(BASIC認(rèn)證或DIGEST認(rèn)證)匣砖。 -
403 Forbidden
:表示請(qǐng)求被服務(wù)器拒絕科吭,往往是客戶端所在IP地址未授權(quán)。 -
404 Not Found
:表明在服務(wù)器上找不到這個(gè)資源猴鲫,或服務(wù)器拒絕請(qǐng)求不想說(shuō)明理由時(shí)也能使用对人。 -
500 Internal Server Error
:服務(wù)器在執(zhí)行請(qǐng)求時(shí)出錯(cuò),可能是服務(wù)器語(yǔ)法錯(cuò)誤拂共。 -
503 Service Unavailable
:服務(wù)器暫時(shí)處于超負(fù)載(掛了)或正在維護(hù)中牺弄,暫時(shí)無(wú)法執(zhí)行請(qǐng)求。