Http協(xié)議
HTTP(TyperText Transport Protocol)協(xié)議是互聯(lián)網(wǎng)上應(yīng)用最廣泛的一種網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn)肝劲。所有WWW文件都必須遵守這個標(biāo)準(zhǔn)纺铭。目前普遍使用的版本是 HTTP1.1悔捶。
HTTP協(xié)議的特點(diǎn):
- 支持C/S模式。
- 簡單快速。客戶端向服務(wù)器請求服務(wù)時只需要傳送請求方法和路徑坛吁。
- 靈活。HTTP允許傳輸任意類型的數(shù)據(jù)對象铐尚。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記拨脉。
- 無連接。無連接的含義是限制每次連接只處理一個請求宣增。服務(wù)器收到客戶端的請求玫膀,并收到客戶端的應(yīng)答后即斷開連接。
- 無狀態(tài)爹脾。HTTP協(xié)議是無狀態(tài)協(xié)議帖旨。無狀態(tài)是指協(xié)議對于事物處理沒有記憶能力箕昭。
HTTP報(bào)文格式
HTTP報(bào)文是面向文本的,報(bào)文中的每一個字段都是一些ASCII碼串解阅,各個字段的長度是不確定的落竹。HTTP有兩類報(bào)文:即請求報(bào)文和響應(yīng)報(bào)文。
1瓮钥、請求報(bào)文
一個HTTP請求報(bào)文由 請求行(request line)、請求頭部(header)烹吵、空行和請求數(shù)據(jù)4部分組成碉熄。
請求報(bào)文的一般格式如下圖:
1).請求頭
請求頭由請求方法字段、URL字段和HTTP協(xié)議版本字段 組成肋拔,他們之間用空格分隔锈津。
例如:GET /index.html HTTP1.1
常見的HTTP請求方法有如下幾種
請求方法 | 含義 |
---|---|
GET | 請求獲取Request-URL所標(biāo)識的資源 |
POST | 在Request-URL鎖標(biāo)識的資源后附加新的數(shù)據(jù) |
HEAD | 請求獲取由Request—URL所標(biāo)識的資源的響應(yīng)消息報(bào)頭 |
PUT | 請求服務(wù)器存儲一個資源,并用Request-URL作為標(biāo)識符 |
DELETE | 請求服務(wù)器刪除Request-URL所標(biāo)識的資源 |
TRACE | 請求服務(wù)器回送收到的請求信息凉蜂,主要用于測試或診斷 |
CONNECT | 保留將來使用 |
OPTIONS | 請求查詢服務(wù)器性能琼梆,或查詢與資源相關(guān)的選項(xiàng)或需求 |
- GET
GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶端窿吩。使用GET時請求參數(shù)和對應(yīng)的值附加在URL后面茎杂,利用一個“?”分隔纫雁,參數(shù)之間使用“&”分隔煌往。傳參數(shù)的長度受限制。顯然這種方式不適合傳輸私密數(shù)據(jù)轧邪,另外由于不同瀏覽器對地址的字符限制有所不同刽脖,一般最多只能是1024個字符。所以如果傳輸大量的數(shù)據(jù)時也不適合使用GET忌愚。
- POST
POST方式將請求參數(shù)封裝在HTTP請求數(shù)據(jù)中曲管,以名稱/值形式出現(xiàn),可以傳輸大量的數(shù)據(jù)硕糊,POST方式對傳輸數(shù)據(jù)的大小沒有限制院水,而且也不會顯示在URL中。
- HEAD
HEAD就像GET简十,只不過服務(wù)器收到HEAD請求后只返回響應(yīng)頭衙耕,而不會返回響應(yīng)內(nèi)容。當(dāng)我們只需要查詢每個頁面的狀態(tài)時使用HEAD是非常高效的勺远。因?yàn)閭鬏斶^程中省去了頁面內(nèi)容橙喘。
POST與PUT的區(qū)別:
在HTTP中,PUT被定義為idempotent的方法胶逢,POST則不是厅瞎,這是一個很重要的區(qū)別饰潜。
如果一個方法重復(fù)執(zhí)行多次,產(chǎn)生的效果是一樣的和簸,那就是idempotent的彭雾。
在編程中.一個冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。冪等函數(shù)锁保,或冪等方法薯酝,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)爽柒。這些函數(shù)不會影響系統(tǒng)狀態(tài)吴菠,也不用擔(dān)心重復(fù)執(zhí)行會對系統(tǒng)造成改變.
舉一個簡單的例子,假如有一個博客系統(tǒng)提供一個Web API浩村,模式是這樣http://superblogging/blogs/post/{blog-name}做葵,
很簡單,將{blog-name}替換為我們的blog名字心墅,往這個URI發(fā)送一個HTTP PUT或者POST請求酿矢,HTTP的body部分就是博文,這是一個很簡單的REST API例子怎燥。我們應(yīng)該用PUT方法還是POST方法瘫筐?取決于這個REST服務(wù)的行為是否是idempotent的,假如我們發(fā)送兩個
http://superblogging/blogs/post/Sample
請求铐姚,服務(wù)器端是什么樣的行為严肪?如果產(chǎn)生了兩個博客帖子,那就說明這個服務(wù)不是idempotent的谦屑,因?yàn)槎啻问褂卯a(chǎn)生了副作用了嘛驳糯;如果后一個請求把第一個請求覆蓋掉了,那這個服務(wù)就是idempotent的氢橙。前一種情況酝枢,應(yīng)該使用POST方法,后一種情況悍手,應(yīng)該使用PUT方法帘睦。
2)、請求頭部
請求頭部由關(guān)鍵字/值對組成坦康,每行一對竣付,關(guān)鍵字和值用英文冒號“:”分隔。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息滞欠,典型的請求頭有:
User-Agent:產(chǎn)生請求的瀏覽器類型古胆。
Accept:客戶端可識別的內(nèi)容類型列表。
Host:請求的主機(jī)名,允許多個域名同處一個IP地址逸绎,即虛擬主機(jī)惹恃。
3)、空行
最后一個請求頭之后是一個空行棺牧,發(fā)送回車符和換行符巫糙,通知服務(wù)器以下不再有請求頭。
4)颊乘、請求數(shù)據(jù)
請求數(shù)據(jù)不在GET方法中使用参淹,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場合乏悄。與請求數(shù)據(jù)相關(guān)的最常使用的請求頭是Content-Type和Content-Length浙值。
2、HTTP響應(yīng)報(bào)文
HTTP響應(yīng)報(bào)文也是由4部分組成纲爸,分別是:狀態(tài)行亥鸠、消息頭部妆够、空行和響應(yīng)正文识啦。格式如下圖:
正如你所見,在響應(yīng)中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請求信息神妹。狀態(tài)行(status line)通過提供一個狀態(tài)碼來說明所請求的資源情況颓哮。
狀態(tài)行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本鸵荠;Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼冕茅;Reason-Phrase表示狀態(tài)代碼的文本描述。狀態(tài)代碼由三位數(shù)字組成蛹找,第一個數(shù)字定義了響應(yīng)的類別姨伤,且有五種可能取值。
- 1xx:指示信息--表示請求已接收庸疾,繼續(xù)處理乍楚。
- 2xx:成功--表示請求已被成功接收、理解届慈、接受徒溪。
- 3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作。
- 4xx:客戶端錯誤--請求有語法錯誤或請求無法實(shí)現(xiàn)金顿。
- 5xx:服務(wù)器端錯誤--服務(wù)器未能實(shí)現(xiàn)合法的請求臊泌。
常見狀態(tài)代碼、狀態(tài)描述的說明如下揍拆。
- 200 OK:客戶端請求成功渠概。
- 400 Bad Request:客戶端請求有語法錯誤,不能被服務(wù)器所理解嫂拴。
- 401 Unauthorized:請求未經(jīng)授權(quán)高氮,這個狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用慧妄。
- 403 Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)剪芍。
- 404 Not Found:請求資源不存在塞淹,舉個例子:輸入了錯誤的URL。
- 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯誤罪裹。
- 503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請求饱普,一段時間后可能恢復(fù)正常,舉個例子:HTTP/1.1 200 OK(CRLF)状共。
3套耕、HTTP消息報(bào)頭
如前所述,HTTP消息由客戶端到服務(wù)器的請求和服務(wù)器到客戶端的響應(yīng)組成峡继。請求消息和響應(yīng)消息都是由開始行(對于請求消息開始行就是請求行冯袍,對于響應(yīng)消息,開始行是狀態(tài)行)碾牌、消息頭部(可選)康愤、空行(只有CRLF的行)、消息正文4部分組成舶吗。其中消息報(bào)頭包括普通報(bào)頭征冷、請求報(bào)頭、響應(yīng)報(bào)頭誓琼、實(shí)體報(bào)頭检激。消息報(bào)頭由頭部名/值對組成,每行一對腹侣,頭部字段名和值用“:”分隔叔收。其中消息報(bào)頭頭部字段名是大小寫無關(guān)的。報(bào)頭描述了客戶端或者服務(wù)器的屬性傲隶,被傳送的資源以及實(shí)體連接饺律。
4種不同類型的消息報(bào)頭分述如下:
普通報(bào)頭:即可用于請求,也可用于響應(yīng)伦籍,不用于被傳輸實(shí)體蓝晒,只用于傳輸消息,是作為一個整體而不是特定的資源與事物關(guān)聯(lián)帖鸦。
請求報(bào)頭:允許客戶端傳遞關(guān)于自身的信息和希望響應(yīng)的形式芝薇。請求報(bào)頭通知服務(wù)端有關(guān)客戶端的請求信息。典型的有如下幾種:
User-Agent:包含產(chǎn)生請求的操作系統(tǒng)作儿,瀏覽器類型等信息
Accept:客戶端可識別內(nèi)容類型列表洛二,用于指定客戶端接受那些類型的信息。
Host:請求主機(jī)名,允許多個域名同處一個IP地址晾嘶,即虛擬主機(jī)
- 響應(yīng)報(bào)頭:服務(wù)器用于傳遞自身信息的響應(yīng)妓雾。如:
Location:用于重定向接收者到一個新的位置。Location響應(yīng)域名常用在更換域名的時候
Server:包含服務(wù)器用來處理請求的系統(tǒng)信息垒迂,與User-Agent請求報(bào)頭是相對應(yīng)的械姻。
- 實(shí)體報(bào)頭:定義被傳送資源的信息。即可用于請求机断,也可用于響應(yīng)楷拳。請求和響應(yīng)消息都可以傳送一個實(shí)體。如:
Content-Encoding:被用作媒體類型的修飾符吏奸,它的值指示了已經(jīng)被應(yīng)用到實(shí)體正文的附加內(nèi)容的編碼欢揖。因而要獲得Content-Type報(bào)頭中所引用的媒體類型,必須采用響應(yīng)的解碼機(jī)制奋蔚。
Content-Language:描述了資源所用的自然語言她混。沒有設(shè)置該選項(xiàng)則認(rèn)為實(shí)體內(nèi)容將提供給所用語言閱讀。
Content-Length:用于致命實(shí)體正文的長度泊碑,以字節(jié)方式存儲十進(jìn)制來表示
Last-Modified:用于指示資源的最后修改日期和時間坤按。
注意:URL中的一些字符有特殊的含義,基本編碼規(guī)則如下:
空格換成(+)號蛾狗;正斜杠(/)分隔目錄和子目錄晋涣;問好(?)分隔URL和查詢仪媒;百分號(%)指定特殊字符沉桌;#號指定書簽;&號分隔參數(shù)算吩,有時也做為連接符留凭。