一海诲,HTTP報(bào)文
用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文扛点。請(qǐng)求端(客戶端)的HTTP報(bào)文稱為請(qǐng)求報(bào)文,響應(yīng)端(服務(wù)器端)的叫做響應(yīng)報(bào)文砚尽。
HTTP報(bào)文大致可分為報(bào)文首部和報(bào)文主體兩部分拆撼,兩者由最初出現(xiàn)的空行(CR+LF)來劃分容劳。通常并不一定要有報(bào)文主體。
請(qǐng)求報(bào)文和響應(yīng)報(bào)文的首部內(nèi)容由以下數(shù)據(jù)組成:
1情萤,請(qǐng)求行
包含用于請(qǐng)求的方法鸭蛙,請(qǐng)求URI和HTTP版本;
2筋岛,狀態(tài)行
包含表明響應(yīng)結(jié)果的狀態(tài)碼娶视,原因短語和HTTP版本;
3睁宰,首部字段
包含表示請(qǐng)求和響應(yīng)的各種條件和屬性的各類首部肪获;一般有四個(gè)首部,分別是:通用首部柒傻、請(qǐng)求首部孝赫、響應(yīng)首部和實(shí)體首部;
4红符,其他:
可能包含HTTP的RFC里未定義的首部(Cookie等)青柄。
報(bào)文主體和實(shí)體主體的差異
報(bào)文是HTTP通信中的基本單位伐债,由8位組字節(jié)流組成,通過HTTP通信傳輸致开。實(shí)體是作為請(qǐng)求或響應(yīng)的有效載荷數(shù)據(jù)(補(bǔ)充項(xiàng))被傳輸峰锁,其內(nèi)容由實(shí)體首部和實(shí)體主體組成。
報(bào)文的主體用于傳輸請(qǐng)求或響應(yīng)的實(shí)體主體双戳。通常報(bào)文主體等于實(shí)體主體虹蒋,只有當(dāng)傳輸中進(jìn)行編碼操作時(shí),實(shí)體主體的內(nèi)容發(fā)生變化飒货,才與報(bào)文主體產(chǎn)生差異魄衅。
HTTP協(xié)議中有一種被稱為內(nèi)容編碼的功能,使郵件容量變小塘辅,以ZIP壓縮文件添加附件放松晃虫。常用的內(nèi)容編碼有以下幾種:
1,GZIP(GNU Zip)
2扣墩,compress(UNIX系統(tǒng)的標(biāo)準(zhǔn)壓縮)
3傲茄,deflate(zlib)
4,identity(不進(jìn)行編碼)
在HTTP通信過程中沮榜,請(qǐng)求的編碼實(shí)體資源未全部傳輸完成之前,瀏覽器無法顯示請(qǐng)求頁面喻粹。但傳輸大容量數(shù)據(jù)時(shí)蟆融,通過把數(shù)據(jù)分割成多塊,能夠讓瀏覽器逐步顯示頁面守呜。這種把實(shí)體主體分塊的功能稱為分塊傳輸編碼型酥。使用分塊傳輸編碼的實(shí)體主體由接受的客戶端負(fù)責(zé)解碼,恢復(fù)編碼前的實(shí)體主體查乒。
發(fā)送郵件時(shí)弥喉,我們可以在郵件里寫入文字并添加多份附件,這可以采用MIME(多用途因特網(wǎng)郵件擴(kuò)展)機(jī)制玛迄,它允許郵件處理文本由境、圖片、視頻等多個(gè)不同類型的數(shù)據(jù)蓖议。
HTTP協(xié)議中也采納了多部分對(duì)象集合虏杰,發(fā)送的一份報(bào)文主體可含有多類型實(shí)體。通過是在圖片或文本文件等上傳時(shí)使用勒虾。但是用戶在下載過程中會(huì)出現(xiàn)圖片或文件下載過程中斷的情況纺阔,需要重新開始,因此這其中需要一種可恢復(fù)的機(jī)制修然,即指能從之前下載中斷處恢復(fù)下載笛钝。要實(shí)現(xiàn)這種功能需要指定下載的實(shí)體范圍质况,這種指定范圍發(fā)送的請(qǐng)求叫做范圍請(qǐng)求。
針對(duì)范圍請(qǐng)求玻靡,響應(yīng)會(huì)返回狀態(tài)碼為206 Partial Content的響應(yīng)報(bào)文结榄。多重范圍的范圍請(qǐng)求,響應(yīng)會(huì)在首部字段Content-Type標(biāo)明multipart/byteranges后返回響應(yīng)報(bào)文啃奴。如果服務(wù)器無法響應(yīng)范圍請(qǐng)求潭陪,則會(huì)返回狀態(tài)碼200 OK和完整的實(shí)體內(nèi)容。
內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉最蕾,然后提供給客戶端最為適合的資源依溯。內(nèi)容協(xié)商會(huì)以響應(yīng)資源的語言、字符集瘟则、編碼方式等作為判斷的基準(zhǔn)黎炉。包含在請(qǐng)求報(bào)文中的某些首部字段就是判斷的基準(zhǔn)。
1醋拧,Accept
2慷嗜,Accept-Charset
3,Accept-Encoding
4丹壕,Accept-Language
5庆械,Content-Language
內(nèi)容協(xié)商技術(shù)可以有以下3種類型:
1,服務(wù)器驅(qū)動(dòng)協(xié)商菌赖,即由服務(wù)器端進(jìn)行內(nèi)容協(xié)商缭乘。以請(qǐng)求的首部字段為參考,服務(wù)器端會(huì)自動(dòng)處理琉用。
2堕绩,客戶端驅(qū)動(dòng)協(xié)商,即由客戶端進(jìn)行內(nèi)容協(xié)商的方式邑时。用戶從瀏覽器顯示的可選項(xiàng)列表中手動(dòng)選擇奴紧。還有利用JavaScript腳本在Web頁面上自動(dòng)進(jìn)行選擇。
3晶丘,透明協(xié)商黍氮,即服務(wù)器驅(qū)動(dòng)和客戶端驅(qū)動(dòng)的結(jié)合體。
二浅浮,返回結(jié)果的HTTP狀態(tài)碼
HTTP狀態(tài)碼負(fù)責(zé)表示客戶端HTTP請(qǐng)求的返回結(jié)果滤钱,標(biāo)記服務(wù)器端的處理是否正常,通知出現(xiàn)的錯(cuò)誤等工作脑题。
狀態(tài)碼的類別主要有以下幾種:
HTTP狀態(tài)碼種類繁多件缸,簡述下列幾種常見的狀態(tài)碼:
2XX的響應(yīng)結(jié)果表明請(qǐng)求被正常處理了。
1叔遂,200 OK
表示從客戶端發(fā)來的請(qǐng)求在服務(wù)器端被正常處理了他炊。注意的是争剿,在響應(yīng)報(bào)文內(nèi),隨狀態(tài)碼一起返回的信息回因方法的不同而發(fā)生改變痊末。
該狀態(tài)碼代表服務(wù)器接收的請(qǐng)求已成功處理,但在返回的響應(yīng)報(bào)文中不含實(shí)體的主體部分凿叠。另外涩笤,也不允許返回任何實(shí)體的主體。
該狀態(tài)碼表示客戶端進(jìn)行了范圍請(qǐng)求蹬碧,服務(wù)器也成功執(zhí)行了這部分的GET請(qǐng)求。響應(yīng)報(bào)文中包含由Content-Range指定范圍的實(shí)體內(nèi)容炒刁。
3XX響應(yīng)結(jié)果表明瀏覽器需要執(zhí)行某些特殊的處理以正確處理請(qǐng)求恩沽。
1,301 Moved Permanently
永久性重定向翔始。該狀態(tài)碼表示請(qǐng)求的資源已被分配了新的URI罗心,以后應(yīng)使用資源現(xiàn)在所指的URI。
臨時(shí)性重定向渤闷。該狀態(tài)碼表示請(qǐng)求的資源已被分配了新的URI,希望用戶(本次)能使用新的URI訪問脖镀。但是與301狀態(tài)碼不同的是已移動(dòng)的資源對(duì)應(yīng)的URI將來還有可能發(fā)生改變肤晓。
該狀態(tài)碼表示由于請(qǐng)求對(duì)應(yīng)的資源存在著另一個(gè)URI认然,應(yīng)使用GET方法定向獲取請(qǐng)求的資源。當(dāng)301漫萄、302卷员、303響應(yīng)狀態(tài)碼返回時(shí),幾乎所有的瀏覽器都會(huì)把POST改成GET腾务,并刪除請(qǐng)求報(bào)文內(nèi)的主體毕骡,之后請(qǐng)求會(huì)自動(dòng)再次發(fā)送。
該狀態(tài)碼表示客戶端發(fā)送附帶條件的請(qǐng)求時(shí)未巫,服務(wù)器端允許請(qǐng)求訪問資源,但未滿足條件的情況启昧。304狀態(tài)碼返回時(shí)叙凡,不包含任何響應(yīng)的主體部分。304被劃分在3XX類別中密末,但和重定向沒有關(guān)系握爷。
臨時(shí)重定向。該狀態(tài)碼和302 Found有著相同的含義新啼。盡管302標(biāo)準(zhǔn)禁止POST改為GET追城,但實(shí)際使用時(shí)大家并不遵守。但是307會(huì)遵照瀏覽器標(biāo)準(zhǔn)燥撞,不會(huì)從POST變成GET座柱。但是,對(duì)于處理響應(yīng)時(shí)的行為物舒,每種瀏覽器有可能出現(xiàn)不同情況色洞。
4XX的響應(yīng)結(jié)果表明客戶端是發(fā)生錯(cuò)誤的原因所在。
1茶鉴,400 Bad Request
該狀態(tài)碼表示請(qǐng)求報(bào)文中存在語法錯(cuò)誤锋玲。
2,401 Unauthorized
該狀態(tài)碼表示發(fā)送的請(qǐng)求需要有通過HTTP認(rèn)證(BASIC認(rèn)證涵叮、DIGEST認(rèn)證)的認(rèn)證信息惭蹂。另外,若之前已進(jìn)行過一次請(qǐng)求割粮,則表示擁護(hù)認(rèn)證失敗盾碗。返回含有401的響應(yīng)必須包含一個(gè)適用于被請(qǐng)求資源的WWW-Authenticate首部用以質(zhì)詢用戶信息。當(dāng)瀏覽器初次接收到401響應(yīng)舀瓢,會(huì)彈出認(rèn)證用的對(duì)話窗口廷雅。
該狀態(tài)碼表示對(duì)請(qǐng)求資源的訪問被服務(wù)器拒絕了京髓。服務(wù)器端沒有必要給出拒絕的詳細(xì)理由航缀,但是如果想作說明,可以在實(shí)體的主體部分對(duì)原因進(jìn)行詳述堰怨。
該狀態(tài)碼表明服務(wù)器上無法找到請(qǐng)求的資源。除此之外备图,也可以在服務(wù)器端被拒絕請(qǐng)求且不想說明理由時(shí)使用灿巧。
5XX的響應(yīng)結(jié)果表明服務(wù)器本身發(fā)生錯(cuò)誤。
1揽涮,500 Internal Server Error
該狀態(tài)碼表明服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤抠藕。也有可能是Web應(yīng)用存在的Bug或某些臨時(shí)的故障。
2蒋困,503 Service Unavailable
該狀態(tài)碼表明服務(wù)器臨時(shí)處于超負(fù)載貨正在進(jìn)行停機(jī)維護(hù)盾似,現(xiàn)在無法處理請(qǐng)求。如果事先得知解除以上狀態(tài)需要的時(shí)間雪标,最好寫入Retry-After首部字段再返回給客戶端颜说。
最后要注意的是购岗,有可能出現(xiàn)狀態(tài)碼和狀態(tài)的不一致。即不少返回的狀態(tài)碼響應(yīng)都是錯(cuò)誤的门粪,但是不用難以察覺喊积。比如Web應(yīng)用程序內(nèi)部發(fā)生錯(cuò)誤,狀態(tài)碼依舊返回200 OK玄妈。