第一章
媒體類型
- MIME:
因特網(wǎng)上有數(shù)千種不同的數(shù)據(jù)類型,HTTP仔細(xì)地給每種要通過(guò)web傳輸?shù)膶?duì)象都打上了名為MIME類型的數(shù)據(jù)格式標(biāo)簽。HTTP采用它來(lái)描述冰標(biāo)記多媒體內(nèi)容。最初設(shè)計(jì)MIME(Multipurpose Internet Mail Extension,多用途引入網(wǎng)郵件擴(kuò)展)是為了解決在不同的電子郵件系統(tǒng)之間搬移報(bào)文時(shí)存在的問(wèn)題。
web服務(wù)器會(huì)為所有HTTP對(duì)象數(shù)據(jù)附加一個(gè)MIME類型。當(dāng)Web瀏覽器從服務(wù)器中取回一個(gè)對(duì)象時(shí),會(huì)去查看相關(guān)的MIME類型,看看是否知道應(yīng)該如何處理這個(gè)對(duì)象。大多數(shù)瀏覽器都可以處理數(shù)百種常見(jiàn)的對(duì)象類型。
Content-Type: text/html;text/html就是MIME類型
MIME類型查看.png
- URI
統(tǒng)一資源標(biāo)識(shí)符(Uniform Resourcce Identifier),在世界范圍內(nèi)唯一標(biāo)識(shí)并定位信息資源
URI有兩種形式:URL(統(tǒng)一資源定位符)和URN(統(tǒng)一資源名)
URL:是字與阿尼標(biāo)識(shí)符最常見(jiàn)的形式。描述了一臺(tái)特定服務(wù)器上某資源的特定位置。他們可以明確說(shuō)明如何從一個(gè)精確、固定的位置獲取資源。
大部分URL都遵循一種標(biāo)準(zhǔn)格式,這種格式包含三個(gè)部分。
- URL的第一部分被稱為方案(scheme),說(shuō)明了訪問(wèn)資源所使用的協(xié)議類型。這部分通常就是HTTP協(xié)議(http://)
- 第二部分給出了服務(wù)器的因特網(wǎng)地址(www.itdecent.cn)
- 其余部分制定了web服務(wù)器上的某個(gè)資源(u/a2de4733d547)
URN:是作為特定內(nèi)容的唯一名稱使用的,有目前的資源所在地?zé)o關(guān)。使用這些與位置無(wú)關(guān)的URN,就可以將資源四處搬移,通過(guò)URN,還可以用同一個(gè)名字通過(guò)多種網(wǎng)絡(luò)訪問(wèn)協(xié)議來(lái)訪問(wèn)資源。
例如:不論因特網(wǎng)標(biāo)準(zhǔn)文檔RFX 2141位于何處,都可以用一下URN來(lái)命名它:
urn:ietf:rfc:2141
事務(wù)
- 方法:每條HTTP請(qǐng)求報(bào)文都包含一個(gè)方法。這個(gè)方法告訴服務(wù)器要執(zhí)行什么動(dòng)作
一個(gè)HTTP事務(wù)由一條(從客戶端發(fā)往服務(wù)器的)請(qǐng)求命令和一個(gè)(從服務(wù)器發(fā)回客戶端的)響應(yīng)結(jié)果組成。這種通信是通過(guò)HTTP報(bào)文的格式化數(shù)據(jù)塊進(jìn)行的。
PUT和POST的區(qū)別是什么?
之前只知道put和post可以修改數(shù)據(jù),PUT方法通常用來(lái)新增數(shù)據(jù),POST通常用來(lái)修改數(shù)據(jù),不清楚具體的區(qū)別是什么。
如果請(qǐng)求通過(guò)緩存并且請(qǐng)求 URI 標(biāo)識(shí)了 一個(gè)或多個(gè)當(dāng)前緩存的實(shí)體,則這些條目應(yīng)該被視為過(guò)時(shí)。對(duì)此方法的響應(yīng)不可緩存。
POST 和 PUT 請(qǐng)求的根本區(qū)別體現(xiàn)在 Request-URI 的不同含義上。
- POST 請(qǐng)求中的 URI標(biāo)識(shí)將處理封閉實(shí)體的資源。該資源可能是一個(gè)數(shù)據(jù)接受進(jìn)程、一個(gè)通往其他協(xié)議的網(wǎng)關(guān),或者是一個(gè)接受注解的獨(dú)立實(shí)體。
- 相比之下,PUT 請(qǐng)求中的 URI 標(biāo)識(shí)了包含在請(qǐng)求中的實(shí)體——用戶代理知道 URI 的意圖,并 服務(wù)器不得嘗試將請(qǐng)求應(yīng)用于某些其他資源。如果服務(wù)器希望將請(qǐng)求應(yīng)用于不同的 URI,F(xiàn)ielding 等。
- PUT如果兩個(gè)請(qǐng)求相同,后一個(gè)請(qǐng)求會(huì)把第一個(gè)請(qǐng)求覆蓋掉。Post請(qǐng)求:后一個(gè)請(qǐng)求不會(huì)把第一個(gè)覆蓋掉。
RFC上看的POST的功能:POST的實(shí)際功能是由服務(wù)器決定,POST方法執(zhí)行的操作可能不會(huì)產(chǎn)生可由URI標(biāo)識(shí)的資源。
在這種情況下,不管是200或204狀態(tài)碼具體的響應(yīng)內(nèi)容取決于響應(yīng)結(jié)果的實(shí)體的描述。如果在遠(yuǎn)程服務(wù)器上資源已被創(chuàng)建,響應(yīng)應(yīng)該是201,并且應(yīng)該創(chuàng)建一個(gè)實(shí)體用來(lái)描述請(qǐng)求的狀態(tài)并且引用新資源的一個(gè)location新地址。
響應(yīng)結(jié)果不可緩存,除非響應(yīng)包含明確的cache-control或expires標(biāo)頭字段。
* 對(duì)現(xiàn)有資源注釋
* 發(fā)送消息
* 向數(shù)據(jù)處理過(guò)程提供數(shù)據(jù)塊,例如:提交表單
* 通過(guò)追加操作擴(kuò)展數(shù)據(jù)庫(kù),通常說(shuō)的新增
RFC上看的PUT的功能:PUT方法請(qǐng)求將包含實(shí)際存儲(chǔ)在提供的Reuqest-URI下面。
如果請(qǐng)求URL引用了一個(gè)已經(jīng)存在的資源,則包含實(shí)體的應(yīng)該被保留被修改后的版本;
如果指向了一個(gè)不存在的資源,并且URI可以使用新創(chuàng)建的資源被客戶端訪問(wèn),那么遠(yuǎn)程服務(wù)器就創(chuàng)建一個(gè)這個(gè)URI;
如果創(chuàng)建了新資源,應(yīng)發(fā)送201狀態(tài)碼響應(yīng)用戶代理。
如果修改現(xiàn)有資源,應(yīng)發(fā)送200或204響應(yīng)代碼表示請(qǐng)求成功完成。
如果資源不能用Request-URI創(chuàng)建或修改,應(yīng)該給出一個(gè)適當(dāng)?shù)腻e(cuò)誤響應(yīng)來(lái)反應(yīng)問(wèn)題的性質(zhì)。實(shí)體的接受者不得忽略它不理解或沒(méi)有實(shí)現(xiàn)則必須返回一個(gè)501狀態(tài)碼
參考:


上圖所示主體:即我們經(jīng)常在接口中使用的用來(lái)傳輸數(shù)據(jù)的Body部分

- 狀態(tài)碼
是一個(gè)三位數(shù)字的代碼,告知客戶端請(qǐng)求是否成功,或者是否需要采取其他動(dòng)作
事務(wù)TCP/IP
- TCP
提供了
- 無(wú)差錯(cuò)的數(shù)據(jù)傳輸
- 按序傳輸(數(shù)據(jù)按照發(fā)送的順序到達(dá))
- 未分段的數(shù)據(jù)流(可以在任意時(shí)刻以任意尺寸將數(shù)據(jù)發(fā)送出去)
TCP/IP是全世界的計(jì)算機(jī)和網(wǎng)絡(luò)設(shè)備常用的層次化分組交換網(wǎng)絡(luò)協(xié)議集。TCP/IP隱藏了各種網(wǎng)絡(luò)和硬件的特點(diǎn)以及弱點(diǎn),使各種類型的計(jì)算機(jī)和網(wǎng)絡(luò)都能夠進(jìn)行可靠地通信。
只要建立了TCP連接,客戶端和服務(wù)器之間的報(bào)文交換就不會(huì)丟失、不會(huì)被破壞,也不會(huì)在接收時(shí)出現(xiàn)錯(cuò)序了
連接
DNS(Domain Name Service)將主機(jī)名轉(zhuǎn)換為IP地址
瀏覽器是怎樣通過(guò)HTTP顯示位于遠(yuǎn)端服務(wù)器中的某個(gè)簡(jiǎn)單HTML資源的?

- 瀏覽器從URL中解析出服務(wù)器的主機(jī)名
- 瀏覽器將服務(wù)器的主機(jī)名轉(zhuǎn)換為服務(wù)器的IP地址
- 瀏覽器將端口號(hào)從URL中解析出來(lái)
- 瀏覽器建立一條與WEB服務(wù)器的TCP連接
- 瀏覽器想服務(wù)器發(fā)送HTTP請(qǐng)求報(bào)文
- 服務(wù)器向?yàn)g覽器會(huì)送HTTP響應(yīng)報(bào)文
- 關(guān)閉連接,瀏覽器顯示文檔
使用Telnet實(shí)例
什么是Telnet?
Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Telnet遠(yuǎn)程登錄服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式。它為用戶提供了本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。要開始一個(gè)telnet會(huì)話,必須要輸入用戶名和密碼來(lái)登錄服務(wù)器。
使用Telnet實(shí)例
什么是Telnet?
Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Telnet遠(yuǎn)程登錄服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式。它為用戶提供了本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。要開始一個(gè)telnet會(huì)話,必須要輸入用戶名和密碼來(lái)登錄服務(wù)器。
仿真終端等效于一個(gè)非智能的機(jī)器,它只負(fù)責(zé)把用戶輸入的每個(gè)字符傳遞給主機(jī),再將主機(jī)輸出的每個(gè)信息回顯在屏幕上
協(xié)議版本
HTTP0.9請(qǐng)求中只包含方法和請(qǐng)求Url,響應(yīng)中只包含實(shí)體。沒(méi)有版本信息,沒(méi)有狀態(tài)碼或原因短語(yǔ),也沒(méi)有首部。
HTTP1.0重點(diǎn)關(guān)注的是校正HTTP設(shè)計(jì)中的結(jié)構(gòu)性缺陷,明確語(yǔ)義,引入重要的性能優(yōu)化措施,并刪除一些不好的特性。在1.0之前并不要求請(qǐng)求頭和響應(yīng)頭中必須包含HTTP版本號(hào)。
HTTP1.1還包含了對(duì)20世紀(jì)90年代末正在發(fā)展的更復(fù)雜的web應(yīng)用程序和部署方式的支持。HTTP1.1是當(dāng)前使用的HTTP版本
HTTP-NG重點(diǎn)關(guān)注的是性能的大幅優(yōu)化,以及更強(qiáng)大的服務(wù)邏輯遠(yuǎn)程執(zhí)行框架。
Web的結(jié)構(gòu)組件
- 代理:位于客戶端和服務(wù)器之間的HTTP中間實(shí)體
-
緩存:HTTP倉(cāng)庫(kù),使常用頁(yè)面的副本可以保存在離客戶端更近的地方
- 可以將經(jīng)過(guò)代理傳送的常用文檔復(fù)制保存起來(lái)。下一個(gè)請(qǐng)求同一文檔的客戶端就可以享受緩存的私有副本所提供的服務(wù)了。從代理緩存下載資源速度提升
-
網(wǎng)關(guān):連接其他應(yīng)用程序的特殊web服務(wù)器
- 是一種特殊的服務(wù)器,作為其他服務(wù)器的中間實(shí)體使用。常用于將http流量轉(zhuǎn)換成其他的協(xié)議。網(wǎng)關(guān)接收請(qǐng)求時(shí)就好像自己是資源端服務(wù)器一樣。
-
隧道:對(duì)HTTP通信報(bào)文進(jìn)行盲轉(zhuǎn)發(fā)的特殊代理
- HTTP隧道通常用來(lái)在一條或多條HTTP連接上轉(zhuǎn)發(fā)非HTTP數(shù)據(jù),轉(zhuǎn)發(fā)時(shí)不會(huì)窺探數(shù)據(jù)。
- 常見(jiàn)用途是通過(guò)HTTP連接承載加密的安全套接字層流量,這樣SSL流量就可以穿過(guò)只允許web流量通過(guò)的防火墻了。
- Agent代理:發(fā)起自動(dòng)http請(qǐng)求的半智能web客戶端
第2章
因特網(wǎng)資源
URL組成部分
- http是url方法,告知web客戶端怎樣訪問(wèn)資源
- www.baidu.com指的是服務(wù)器的位置,告知web客戶端資源位于何處
- /index.html是資源路徑,說(shuō)明了請(qǐng)求的是服務(wù)器上哪個(gè)特定的本地資源
方案名不區(qū)分大小寫
TCP協(xié)議的HTTP默認(rèn)端口為80
參數(shù):url;type=d,url的每段都可以有自己的參數(shù)
查詢字符串:url?item=12138,url?后面的內(nèi)容,url的查詢組件和標(biāo)識(shí)網(wǎng)關(guān)資源的url路徑組件一起被發(fā)送給網(wǎng)關(guān)資源。基本上可以將網(wǎng)關(guān)當(dāng)做訪問(wèn)其他應(yīng)用程序的訪問(wèn)點(diǎn)。
片段:url#后面的內(nèi)容,客戶端不能將片段傳送給服務(wù)器。瀏覽器從服務(wù)器獲得了整個(gè)資源之后,會(huì)根據(jù)片段來(lái)顯示你感興趣的那部分資源。
自動(dòng)擴(kuò)展url
- 主機(jī)名擴(kuò)展:例如在url中輸入baidu,會(huì)自動(dòng)帶出www.baidu.com
- 歷史擴(kuò)展:將以前用戶訪問(wèn)過(guò)的url歷史存起來(lái),當(dāng)輸入url的時(shí)候,就可以將你輸入的url與歷史記錄中的url前綴進(jìn)行匹配,并提供一些完整的選項(xiàng)供你選擇。例如:在輸入www.bai的時(shí)候會(huì)自動(dòng)帶出baidu的網(wǎng)址
轉(zhuǎn)譯序列:可以用US-ASCII字符集的有限子集對(duì)任意字符值或數(shù)據(jù)進(jìn)行編碼了,這樣就實(shí)現(xiàn)了可移植性和完整性。
編碼機(jī)制:用來(lái)在URL中表示各種不安全的字符。這種編碼機(jī)制就是通過(guò)一種“轉(zhuǎn)義”表示法來(lái)標(biāo)識(shí)不安全的字符的,這種轉(zhuǎn)義表示法包含一個(gè)%后面跟著兩個(gè)表示字符ASCII碼的十六進(jìn)制數(shù)。
http與https
- http:默認(rèn)端口80
- https:默認(rèn)端口443
第3章
報(bào)文流
是在HTTP應(yīng)用程序之間發(fā)送的數(shù)據(jù)塊。這些數(shù)據(jù)塊以一些文本形式的元信息開頭,這些信息描述了報(bào)文的內(nèi)容以及含義,后面跟著可選的數(shù)據(jù)部分。這些報(bào)文在客戶端、服務(wù)器和代理之間流動(dòng)。
報(bào)文向下游流動(dòng)
不管是請(qǐng)求報(bào)文還是響應(yīng)報(bào)文,所有報(bào)文都會(huì)向下游游動(dòng)。
報(bào)文的組成部分
一條來(lái)自服務(wù)器的響應(yīng)由3部分組成:對(duì)報(bào)文進(jìn)行描述的起始行、包含屬性的首部塊、可選的包含數(shù)據(jù)的主體部分
方法
安全方法
操作不會(huì)產(chǎn)生任何的動(dòng)作,get和head方法被認(rèn)為是安全的。操作不會(huì)產(chǎn)生任何的動(dòng)作不會(huì)產(chǎn)生任何動(dòng)作這是由開發(fā)者決定的
GET:通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源
HEAD:服務(wù)器在響應(yīng)時(shí)只返回首部。不會(huì)返回實(shí)體的主體部分。這就允許客戶端在未獲取實(shí)際資源的情況下,對(duì)資源的首部進(jìn)行檢查。HEAD是HTTP1.0中定義的請(qǐng)求方法。多用于自動(dòng)搜索機(jī)器人獲取網(wǎng)頁(yè)的標(biāo)志信息,獲取rss種子信息,或者傳遞安全認(rèn)證信息等。
- 可以在不獲取資源的情況下了解資源情況-檢查資源有效性
- 通過(guò)查看響應(yīng)中的狀態(tài)碼,看看某個(gè)對(duì)象是否存在-查看資源有效性
- 通過(guò)查看首部,測(cè)試資源是否被修改了-檢查網(wǎng)頁(yè)是否被篡改
PUT:會(huì)向服務(wù)器寫入文檔。讓服務(wù)器用請(qǐng)求的主體部分來(lái)創(chuàng)建一個(gè)由所請(qǐng)求的主體部分來(lái)創(chuàng)建一個(gè)由所請(qǐng)求的URL命名的新文檔,或者,如果那個(gè)URL已經(jīng)存在的話,就用這個(gè)主體來(lái)替代它。用于向服務(wù)器上的資源中存儲(chǔ)數(shù)據(jù)。
POST:通常會(huì)用它來(lái)支持HTML的表單。用于向服務(wù)器發(fā)送數(shù)據(jù)
TRACE:TRACE方法允許客戶端在最終將請(qǐng)求發(fā)送給服務(wù)器時(shí),看看它變成了什么樣子。
- TRACE請(qǐng)求會(huì)在目的服務(wù)器端發(fā)起一個(gè)“環(huán)回”診斷。行程最后一站的服務(wù)器會(huì)彈回一條TRACE響應(yīng),并在響應(yīng)主體中攜帶它收到的原始請(qǐng)求報(bào)文。這樣客戶端就可以查看在所有中間HTTP應(yīng)用程序組成的請(qǐng)求/響應(yīng)鏈上,原始報(bào)文是否,以及如何被毀壞或修改過(guò)。
- TRACE并不提供區(qū)分這些方法的機(jī)制,導(dǎo)致在中間過(guò)程中可能不同的中間應(yīng)用程序作出不同的響應(yīng)
- 請(qǐng)求中不能帶有實(shí)體的主體部分
Options:請(qǐng)求web服務(wù)器告知其支持的各種功能
DELETE:請(qǐng)服務(wù)器刪除請(qǐng)求URL所指定的資源??蛻舳藨?yīng)用程序無(wú)法保證刪除操作一定會(huì)被執(zhí)行。HTTP規(guī)范允許服務(wù)器在不通知客戶端的情況下撤銷請(qǐng)求。
狀態(tài)碼
- 100-199信息性狀態(tài)碼
- 100 continue客戶端應(yīng)用程序只有在避免向服務(wù)器發(fā)送一個(gè)服務(wù)器無(wú)法處理或使用的大實(shí)體時(shí),才應(yīng)該使用100 continue。
- 客戶端和100 continue:發(fā)送了100 continue的expect首部的客戶端不應(yīng)該永遠(yuǎn)在那兒等待服務(wù)器發(fā)送100 continue響應(yīng),超時(shí)之后,客戶端應(yīng)該直接將實(shí)體發(fā)送出去。
-
服務(wù)器與100 continue:
- 服務(wù)器一般是只會(huì)響應(yīng)發(fā)送100 continue狀態(tài)碼的客戶端進(jìn)行響應(yīng),出錯(cuò)的服務(wù)器也可能會(huì)這么做。
- 服務(wù)器在發(fā)送100 continue之前就收到了部分或者全部的實(shí)體,說(shuō)明客戶端已經(jīng)決定繼續(xù)發(fā)送數(shù)據(jù)了,這樣服務(wù)器就不需要發(fā)送這個(gè)狀態(tài)碼了。但是服務(wù)器讀完請(qǐng)求之后還是應(yīng)該為請(qǐng)求發(fā)送一個(gè)最終狀態(tài)碼。
- 服務(wù)器在讀取實(shí)體的主體部分之前結(jié)束請(qǐng)求收到了帶有100 continue的請(qǐng)求,就不應(yīng)該僅僅是發(fā)送一條響應(yīng)并關(guān)閉連接,因?yàn)檫@樣會(huì)妨礙客戶端接收響應(yīng)。
-
代理與100 continue:
- 代理收到一條請(qǐng)求時(shí),知道下一跳服務(wù)器是HTTP/1.1兼容的,或者不知道下一跳服務(wù)器與哪個(gè)版本兼容,他都應(yīng)該將expect首部放在請(qǐng)求中向下轉(zhuǎn)發(fā)。如果知道下一跳服務(wù)器只能與HTTP/1.1之前的版本兼容,就應(yīng)該以417Expectation Failed錯(cuò)誤進(jìn)行響應(yīng)。
- 如果代理決定代表與HTTP/1.0或之前版本兼容的客戶端,再起請(qǐng)求中放入Expect首部和100 Continue值,那么,如果他從服務(wù)器收到了100 Continue響應(yīng),他就不應(yīng)該將100 Continue響應(yīng)轉(zhuǎn)發(fā)給客戶端,因?yàn)榭蛻舳丝赡懿恢涝撃盟趺崔k。
302、303、307狀態(tài)碼區(qū)別。
- HTTP/1.0客戶端發(fā)起一個(gè)POST請(qǐng)求,并在響應(yīng)中收到302重定向狀態(tài)碼時(shí),它會(huì)接收l(shuí)ocation首部的重定向url,并向那個(gè)URL發(fā)起一個(gè)GET請(qǐng)求。
- HTTP/1.0服務(wù)器收到客戶端發(fā)送的POST請(qǐng)求之后發(fā)送了302狀態(tài)碼,此時(shí)服務(wù)器希望客戶端能夠接收重定向URL,并向重定向URL發(fā)送GET請(qǐng)求。
- HTTP/1.1中用303狀態(tài)碼來(lái)實(shí)現(xiàn)相同的行為。這樣服務(wù)器就可以將302狀態(tài)碼保留起來(lái)為HTTP/1.0客戶端使用了,因此服務(wù)器端要根據(jù)HTTP版本來(lái)決定發(fā)送適合的狀態(tài)碼。
未完待續(xù)
