一,HTTP報(bào)文
用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文。請求端(客戶端)的HTTP報(bào)文稱為請求報(bào)文,響應(yīng)端(服務(wù)器端)的叫做響應(yīng)報(bào)文。
HTTP報(bào)文大致可分為報(bào)文首部和報(bào)文主體兩部分,兩者由最初出現(xiàn)的空行(CR+LF)來劃分。通常并不一定要有報(bào)文主體。
請求報(bào)文和響應(yīng)報(bào)文的首部內(nèi)容由以下數(shù)據(jù)組成:
1,請求行
包含用于請求的方法,請求URI和HTTP版本;
2,狀態(tài)行
包含表明響應(yīng)結(jié)果的狀態(tài)碼,原因短語和HTTP版本;
3,首部字段
包含表示請求和響應(yīng)的各種條件和屬性的各類首部;一般有四個(gè)首部,分別是:通用首部、請求首部、響應(yīng)首部和實(shí)體首部;
4,其他:
可能包含HTTP的RFC里未定義的首部(Cookie等)。
報(bào)文主體和實(shí)體主體的差異
報(bào)文是HTTP通信中的基本單位,由8位組字節(jié)流組成,通過HTTP通信傳輸。實(shí)體是作為請求或響應(yīng)的有效載荷數(shù)據(jù)(補(bǔ)充項(xiàng))被傳輸,其內(nèi)容由實(shí)體首部和實(shí)體主體組成。
報(bào)文的主體用于傳輸請求或響應(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通信過程中,請求的編碼實(shí)體資源未全部傳輸完成之前,瀏覽器無法顯示請求頁面。但傳輸大容量數(shù)據(jù)時(shí),通過把數(shù)據(jù)分割成多塊,能夠讓瀏覽器逐步顯示頁面。這種把實(shí)體主體分塊的功能稱為分塊傳輸編碼。使用分塊傳輸編碼的實(shí)體主體由接受的客戶端負(fù)責(zé)解碼,恢復(fù)編碼前的實(shí)體主體。
發(fā)送郵件時(shí),我們可以在郵件里寫入文字并添加多份附件,這可以采用MIME(多用途因特網(wǎng)郵件擴(kuò)展)機(jī)制,它允許郵件處理文本、圖片、視頻等多個(gè)不同類型的數(shù)據(jù)。
HTTP協(xié)議中也采納了多部分對象集合,發(fā)送的一份報(bào)文主體可含有多類型實(shí)體。通過是在圖片或文本文件等上傳時(shí)使用。但是用戶在下載過程中會出現(xiàn)圖片或文件下載過程中斷的情況,需要重新開始,因此這其中需要一種可恢復(fù)的機(jī)制,即指能從之前下載中斷處恢復(fù)下載。要實(shí)現(xiàn)這種功能需要指定下載的實(shí)體范圍,這種指定范圍發(fā)送的請求叫做范圍請求。
針對范圍請求,響應(yīng)會返回狀態(tài)碼為206 Partial Content的響應(yīng)報(bào)文。多重范圍的范圍請求,響應(yīng)會在首部字段Content-Type標(biāo)明multipart/byteranges后返回響應(yīng)報(bào)文。如果服務(wù)器無法響應(yīng)范圍請求,則會返回狀態(tài)碼200 OK和完整的實(shí)體內(nèi)容。
內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然后提供給客戶端最為適合的資源。內(nèi)容協(xié)商會以響應(yīng)資源的語言、字符集、編碼方式等作為判斷的基準(zhǔn)。包含在請求報(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ū)動協(xié)商,即由服務(wù)器端進(jìn)行內(nèi)容協(xié)商。以請求的首部字段為參考,服務(wù)器端會自動處理。
2,客戶端驅(qū)動協(xié)商,即由客戶端進(jìn)行內(nèi)容協(xié)商的方式。用戶從瀏覽器顯示的可選項(xiàng)列表中手動選擇。還有利用JavaScript腳本在Web頁面上自動進(jìn)行選擇。
3,透明協(xié)商,即服務(wù)器驅(qū)動和客戶端驅(qū)動的結(jié)合體。
二,返回結(jié)果的HTTP狀態(tài)碼
HTTP狀態(tài)碼負(fù)責(zé)表示客戶端HTTP請求的返回結(jié)果,標(biāo)記服務(wù)器端的處理是否正常,通知出現(xiàn)的錯(cuò)誤等工作。
狀態(tài)碼的類別主要有以下幾種:
HTTP狀態(tài)碼種類繁多,簡述下列幾種常見的狀態(tài)碼:
2XX的響應(yīng)結(jié)果表明請求被正常處理了。
1,200 OK
表示從客戶端發(fā)來的請求在服務(wù)器端被正常處理了。注意的是,在響應(yīng)報(bào)文內(nèi),隨狀態(tài)碼一起返回的信息回因方法的不同而發(fā)生改變。
該狀態(tài)碼代表服務(wù)器接收的請求已成功處理,但在返回的響應(yīng)報(bào)文中不含實(shí)體的主體部分。另外,也不允許返回任何實(shí)體的主體。
該狀態(tài)碼表示客戶端進(jìn)行了范圍請求,服務(wù)器也成功執(zhí)行了這部分的GET請求。響應(yīng)報(bào)文中包含由Content-Range指定范圍的實(shí)體內(nèi)容。
3XX響應(yīng)結(jié)果表明瀏覽器需要執(zhí)行某些特殊的處理以正確處理請求。
1,301 Moved Permanently
永久性重定向。該狀態(tài)碼表示請求的資源已被分配了新的URI,以后應(yīng)使用資源現(xiàn)在所指的URI。
臨時(shí)性重定向。該狀態(tài)碼表示請求的資源已被分配了新的URI,希望用戶(本次)能使用新的URI訪問。但是與301狀態(tài)碼不同的是已移動的資源對應(yīng)的URI將來還有可能發(fā)生改變。
該狀態(tài)碼表示由于請求對應(yīng)的資源存在著另一個(gè)URI,應(yīng)使用GET方法定向獲取請求的資源。當(dāng)301、302、303響應(yīng)狀態(tài)碼返回時(shí),幾乎所有的瀏覽器都會把POST改成GET,并刪除請求報(bào)文內(nèi)的主體,之后請求會自動再次發(fā)送。
該狀態(tài)碼表示客戶端發(fā)送附帶條件的請求時(shí),服務(wù)器端允許請求訪問資源,但未滿足條件的情況。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會遵照瀏覽器標(biāo)準(zhǔn),不會從POST變成GET。但是,對于處理響應(yīng)時(shí)的行為,每種瀏覽器有可能出現(xiàn)不同情況。
4XX的響應(yīng)結(jié)果表明客戶端是發(fā)生錯(cuò)誤的原因所在。
1,400 Bad Request
該狀態(tài)碼表示請求報(bào)文中存在語法錯(cuò)誤。
2,401 Unauthorized
該狀態(tài)碼表示發(fā)送的請求需要有通過HTTP認(rèn)證(BASIC認(rèn)證、DIGEST認(rèn)證)的認(rèn)證信息。另外,若之前已進(jìn)行過一次請求,則表示擁護(hù)認(rèn)證失敗。返回含有401的響應(yīng)必須包含一個(gè)適用于被請求資源的WWW-Authenticate首部用以質(zhì)詢用戶信息。當(dāng)瀏覽器初次接收到401響應(yīng),會彈出認(rèn)證用的對話窗口。
該狀態(tài)碼表示對請求資源的訪問被服務(wù)器拒絕了。服務(wù)器端沒有必要給出拒絕的詳細(xì)理由,但是如果想作說明,可以在實(shí)體的主體部分對原因進(jìn)行詳述。
該狀態(tài)碼表明服務(wù)器上無法找到請求的資源。除此之外,也可以在服務(wù)器端被拒絕請求且不想說明理由時(shí)使用。
5XX的響應(yīng)結(jié)果表明服務(wù)器本身發(fā)生錯(cuò)誤。
1,500 Internal Server Error
該狀態(tài)碼表明服務(wù)器端在執(zhí)行請求時(shí)發(fā)生了錯(cuò)誤。也有可能是Web應(yīng)用存在的Bug或某些臨時(shí)的故障。
2,503 Service Unavailable
該狀態(tài)碼表明服務(wù)器臨時(shí)處于超負(fù)載貨正在進(jìn)行停機(jī)維護(hù),現(xiàn)在無法處理請求。如果事先得知解除以上狀態(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。