(轉(zhuǎn))讀HTTP協(xié)議(RFC-2616)總結(jié)
讀HTTP協(xié)議(RFC-2616)總結(jié)
http://ayufox.javaeye.com/blog/391812
關(guān)鍵字: http rest
1.資源(Resource)
什么是資源,首先我們看《架構(gòu)風(fēng)格與基于網(wǎng)絡(luò)的軟件架構(gòu)設(shè)計(jì)》的作者:Roy Thomas Fielding對(duì)資源的一個(gè)說(shuō)明
更精確地說(shuō),資源R是一個(gè)隨時(shí)間變化的成員函數(shù)MR(t),該函數(shù)將時(shí)間t映射到等價(jià)的一個(gè)實(shí)體或值的集合,集合中的值可能是資源的表現(xiàn)和/或資源的標(biāo)識(shí)符。一個(gè)資源可以映射到空集,這允許在一個(gè)概念的任何實(shí)現(xiàn)存在之前引用這個(gè)概念——這一觀念對(duì)于Web之前的大多數(shù)超文本系統(tǒng)來(lái)說(shuō)比較陌生 [61]。一些資源在它們被創(chuàng)建后的任何時(shí)刻來(lái)檢查,它們都對(duì)應(yīng)著相同的值的集合,從這個(gè)意義上說(shuō)它們是靜態(tài)的。其他的資源所對(duì)應(yīng)的值則會(huì)隨時(shí)間而頻繁地變化。對(duì)于一個(gè)資源來(lái)說(shuō),唯一必須是靜態(tài)的是映射的語(yǔ)義,因?yàn)檎Z(yǔ)義才是區(qū)別資源的關(guān)鍵。
簡(jiǎn)而言之,資源是一個(gè)抽象的東西,而在具體資源訪問(wèn)時(shí),會(huì)根據(jù)內(nèi)容協(xié)商的結(jié)果表示成一個(gè)具體表述(Representations)。每個(gè)資源由統(tǒng)一的資源標(biāo)識(shí)符(URI)來(lái)描述,類似于資源的ID,或者說(shuō)資源的地址。
2.表述(Representations)
表述是資源的具體表現(xiàn)形式,譬如,今天深圳的天氣(資源),可以使用一副天氣jpg圖來(lái)描述,也可以XML數(shù)據(jù)來(lái)描述,也可以使用HTML的頁(yè)面來(lái)描述,一種資源可以有多種表述,也就是說(shuō),通過(guò)同一個(gè)URI地址可以獲取到多種表現(xiàn)形式,而具體怎么表現(xiàn),則取決于Web客戶端與Web服務(wù)端內(nèi)容協(xié)商的一個(gè)結(jié)果。
3.內(nèi)容協(xié)商
客戶端和服務(wù)端通過(guò)內(nèi)容協(xié)商來(lái)協(xié)商請(qǐng)求內(nèi)容和響應(yīng)內(nèi)容的格式,主要協(xié)商的內(nèi)容包括:
請(qǐng)求協(xié)商:
1)字符集(Accept-Charset):客戶端通過(guò)發(fā)送該協(xié)商建議服務(wù)端使用該字符集來(lái)發(fā)送響應(yīng)結(jié)果,譬如
Accept-Charset=gb2312,utf-8;q=0.7,*;q=0.7,客戶端建議服務(wù)端優(yōu)先使用gb2312或者utf-8來(lái)發(fā)送響應(yīng)結(jié)果
2)請(qǐng)求編碼(Accept-Encoding):客戶端告訴服務(wù)端客戶端所支持的編碼格式,譬如Accept-Encoding =gzip,deflate表明客戶端支持gzip壓縮或者普通響應(yīng)的結(jié)果
3)語(yǔ)言(Accept-Language):客戶端通過(guò)發(fā)送該協(xié)商告訴服務(wù)端客戶端所使用的語(yǔ)言,譬如Accept-Language=zh-cn,zh;q=0.5表明客戶端偏號(hào)的語(yǔ)言是中文,譬如對(duì)于”今天深圳的天氣“這個(gè)資源來(lái)說(shuō),服務(wù)端可以通過(guò)該選項(xiàng)決定使用什么語(yǔ)言來(lái)表述資源
4)表述偏好(Accept):客戶端通過(guò)該選項(xiàng)告訴服務(wù)端其表述的偏號(hào),譬如一個(gè)請(qǐng)求”今天深圳的天氣“的Ajax程序,可以通過(guò)設(shè)置表述偏好為Accept=application/json來(lái)告訴服務(wù)端,希望得到Json描述的結(jié)果,而一個(gè)瀏覽器則可以通過(guò)傳輸表述偏好為Accept=text/html來(lái)告訴服務(wù)端,希望得到Html描述的結(jié)果
響應(yīng)協(xié)商:
1)表述/表述字符集(Content-Type):服務(wù)端通過(guò)該協(xié)商告訴客戶端表述的格式和字符集的情況,譬如Content-Type=text/html; charset=utf-8表示響應(yīng)內(nèi)容格式為Html,字符集為utf-8
2)表述編碼(Accept-Encoding):服務(wù)端通過(guò)該協(xié)商告訴客戶端表述的編碼,譬如Content-Encoding=gzip服務(wù)端告訴客戶端內(nèi)容使用gzip壓縮
4.方法
方法定義了對(duì)資源的操作,主要的方法包括GET、POST、UPDATE、DELETE等等,它們分別代表了對(duì)資源的讀、建、改、刪的操作
5.緩存
HTTP協(xié)議支持在Web的各個(gè)節(jié)點(diǎn)對(duì)資源的表述進(jìn)行緩存,譬如在瀏覽器客戶端、代理服務(wù)器、反向代理服務(wù)器、目標(biāo)服務(wù)器等上對(duì)表述進(jìn)行緩存(注意,此處的緩存不僅僅是指在目標(biāo)服務(wù)器上進(jìn)行的業(yè)務(wù)級(jí)別的緩存)
1)客戶端請(qǐng)求
如果客戶端緩存了某些表述,則在進(jìn)行讀請(qǐng)求(GET)時(shí),攜帶請(qǐng)求條件(所謂的條件GET,使用Cache-Control指令),服務(wù)端接收到客戶端的請(qǐng)求條件,比較確認(rèn)客戶端的表述是否過(guò)時(shí),如果沒(méi)有,則返回304響應(yīng),否則則把最新的表述響應(yīng)給客戶端
2)服務(wù)端響應(yīng)
服務(wù)端對(duì)一些需要緩存的表述,則響應(yīng)中攜帶緩存指令,告訴請(qǐng)求客戶端如何對(duì)表述進(jìn)行緩存
3)方法對(duì)緩存的影響
當(dāng)對(duì)一個(gè)資源進(jìn)行UPDATE或DELETE時(shí),請(qǐng)求途經(jīng)的所有服務(wù)器(如代理服務(wù)器、反向代理服務(wù)器、目標(biāo)服務(wù)器)會(huì)自動(dòng)將該資源對(duì)應(yīng)的所有表述 緩存失效。
6.狀態(tài)碼
狀態(tài)碼描述了資源請(qǐng)求的結(jié)果,主要狀態(tài)碼包括:
1)1XX:信息類
2)2XX:成功類
典型的成功響應(yīng)包括:
200 OK,表示請(qǐng)求正常處理
201 Created,表示POST請(qǐng)求已經(jīng)接受,資源已創(chuàng)建,對(duì)于此響應(yīng),一般響應(yīng)會(huì)攜帶新建資源的Reference給請(qǐng)求客戶端
202 Accepted,表示POST/UDATE請(qǐng)求已經(jīng)接受,但不一定處理,譬如對(duì)于POST/UPDATE請(qǐng)求為后臺(tái)新建線程處理,可以使用該響應(yīng)碼
3)3XX: 重定向類
典型的重定向響應(yīng)包括:
300 Multiple Choice:表明請(qǐng)求的資源有多種表述
301 Moved Permenently:表明所請(qǐng)求的資源已轉(zhuǎn)移到其他位置,建議到新的位置上去請(qǐng)求資源
304 Not Modify:主要是針對(duì)攜帶條件的GET請(qǐng)求,服務(wù)端向客戶端表明所請(qǐng)求的資源沒(méi)有發(fā)生變化,可以繼續(xù)使用客戶端已緩存的數(shù)據(jù)
4)4XX: 客戶端錯(cuò)誤類
典型的客戶端錯(cuò)誤響應(yīng)包括:
400 Bad Request:表明客戶端的請(qǐng)求格式服務(wù)端無(wú)法識(shí)別
403 Forbiden:客戶端要訪問(wèn)的資源權(quán)限受限,不允許訪問(wèn)
404 Not found:客戶端要訪問(wèn)的資源不存在
405 Method Not Allowed:客戶端請(qǐng)求的方法不允許,譬如有可能一個(gè)資源不允許刪除,則不允許進(jìn)行DELETE請(qǐng)求
408 Request Timeout:請(qǐng)求超時(shí)
5)5XX: 服務(wù)端錯(cuò)誤類
典型的服務(wù)端響應(yīng)包括:
500 Internal Server Error:服務(wù)器內(nèi)部錯(cuò)誤,無(wú)法響應(yīng)
503 Service Unavailable:服務(wù)器無(wú)法處理當(dāng)前請(qǐng)求
504 Gateway Timeout:網(wǎng)關(guān)超時(shí)
posted on 2010-05-18 21:31 liujg 閱讀(216) 評(píng)論(0) 編輯 收藏 所屬分類: Java基礎(chǔ)