讀書筆記-HTTP權(quán)威指南

第一章

媒體類型

  • 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)碼

參考:

image.png

常用的HTTP方法.png

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


image.png
  • 狀態(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資源的?


基本的瀏覽器連接處理.png
  • 瀏覽器從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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容