圖解http mobi_圖解http 完整版pdf_【web必知必會(huì)】
本文關(guān)鍵詞:圖解HTTP,由筆耕文化傳播整理發(fā)布。
【web必知必會(huì)】——圖解HTTP(上)
本篇總結(jié)關(guān)于http的相關(guān)知識(shí),主要內(nèi)容參考如下導(dǎo)圖:
主要講解的內(nèi)容有:
1 URL與URI的區(qū)別。
2 請求報(bào)文與相應(yīng)報(bào)文的內(nèi)容。
3 GET與POST的區(qū)別。
4 http的cookie、持久化、管道化、多部分對象集合、范圍請求等
后續(xù)會(huì)更新http其他的相關(guān)知識(shí)。
關(guān)鍵詞概念平時(shí)會(huì)經(jīng)常接觸到URL,他就是我們訪問web的一個(gè)字符串地址,那么URI是什么呢?他們是什么關(guān)系呢?
先看看官方的解釋:
URL:uniform resource location 統(tǒng)一資源定位符
URI:uniform resource identifier 統(tǒng)一資源標(biāo)識(shí)符
這也就是說,URI是一種資源的標(biāo)識(shí);而URL也是一種URI,也是一種資源的標(biāo)識(shí),但它也指明了如何定位Locate到這個(gè)資源。
URI是一種抽象的資源標(biāo)識(shí),既可以是絕對的,也可以是相對的。但是URL是一種URI,它指明了定位的信息,必須是絕對的。
而我們平時(shí)所說的相對地址,僅僅是相對于另一個(gè)絕對地址而言。
RFC:reqeust for comments 征求修正意見書
RFC素有網(wǎng)絡(luò)知識(shí)圣經(jīng)之稱,規(guī)定了網(wǎng)絡(luò)中協(xié)議的基本內(nèi)容。因此許多的不同系統(tǒng)的應(yīng)用程序才可以互相訪問。
報(bào)文格式
首先報(bào)文的格式如下:
其中空行用于區(qū)分報(bào)文首部和報(bào)文主體內(nèi)容,是由一個(gè)回車符和一個(gè)換行符組成。
無論是請求報(bào)文還是響應(yīng)報(bào)文都需要有報(bào)文首部,當(dāng)然報(bào)文主體有的請求報(bào)文是沒有的。
一般來說,請求報(bào)文的格式如下:
其中請求首部還包括其他的內(nèi)容,不一一列舉了。
響應(yīng)報(bào)文格式如下:
下面我們看一下在不同的瀏覽器中http報(bào)文的內(nèi)容:
上圖是chrome中http的內(nèi)容,其中request headers描述了請求報(bào)文頭部的內(nèi)容,response headers描述了響應(yīng)報(bào)文頭部的內(nèi)容。
其中最長使用的屬性是:
1 URL, 即http訪問的地址
2 request method, 報(bào)文的請求方式
3 status code, 狀態(tài)碼以及狀態(tài)短語
4 Accept Encoding, 內(nèi)容編碼
5 Connection, 連接方式
6 Cookie, 添加的cookie內(nèi)容
7 Host, 目標(biāo)主機(jī)
8 User-Agent, 客戶端瀏覽器的相關(guān)信息
9 Set-Cookie, 指定想要在Cookie中保存的內(nèi)容
常用的屬性內(nèi)容就是上面這些。
在IE中捕獲到的顯示方式不同,但是內(nèi)容都是相同的:
如何發(fā)送http有很多種方式,但是最常用的就是POST和GET。
其他的有些出于安全性的考慮一般都不建議使用。那么POST與GET有什么區(qū)別呢?
1 使用目標(biāo)不同:
POST與GET都用于獲取信息,但是GET方式僅僅是查詢,并不對服務(wù)器上的內(nèi)容產(chǎn)生任何作用結(jié)果;每次GET的內(nèi)容都是相同的。
POST則常用于發(fā)送一定的內(nèi)容進(jìn)行某些修改操作。
2 大小不同:
由于不同的瀏覽器對URL的長度大小有一定的字符限制,因此由于GET方式放在URL的首部中,自然也跟著首先,但是具體的大小要依瀏覽器而定。
POST方式則是把內(nèi)容放在報(bào)文內(nèi)容中,因此只要報(bào)文的內(nèi)容沒有限制,它的大小就沒有限制。
3 安全性不同:
上面也說了GET是直接添加到URL后面的,直接就可以在URL中看到內(nèi)容。
而POST是放在報(bào)文內(nèi)部的,,用戶無法直接看到。
總的來說,GET用于獲取某個(gè)內(nèi)容,POST用于提交某種數(shù)據(jù)請求。
按照使用場景來說,一般用戶注冊的內(nèi)容屬于私密的,這應(yīng)該使用POST方式;而針對某一內(nèi)容的查詢,為了快速的響應(yīng),可以使用GET方式。
無狀態(tài)
由于http是一種無狀態(tài)的協(xié)議,因此無論是客戶端還是服務(wù)器都不記錄http的相關(guān)信息。
這樣設(shè)計(jì)一方面減輕了服務(wù)器端的負(fù)載,另一方面減小了http請求的開銷。
但是針對某些特殊的場景,需要時(shí)刻記錄用戶的相關(guān)信息,這該如何處理呢?
Cookie恰好可以解決這個(gè)問題,Cookie的運(yùn)行機(jī)制如下:
Cookie是一種由服務(wù)器端確定,并保存在客戶端瀏覽器中的內(nèi)容。這樣,就不需要每次都添加用戶的相關(guān)信息,請求會(huì)自動(dòng)添加cookie中對應(yīng)的內(nèi)容。
持久化正常在發(fā)送http時(shí),都需要建立TCP的連接,再發(fā)送報(bào)文。
如果每次想要發(fā)送http報(bào)文都需要經(jīng)過這個(gè)過程,那么時(shí)間大部分都會(huì)消耗在建立和斷開連接的過程中。
因此http中使用了connection屬性,用于指定連接的方式。
當(dāng)設(shè)置成keep-alive,如上面所示的的http頭部信息所示,就會(huì)建立一條持久化的連接。
不需要每次都建立連接,再中斷。
管道化如果一個(gè)http請求,請求了大量的圖片等大文件,那么其他的http請求怎么辦呢?
不用怕,http可以一次發(fā)送多個(gè)http請求,然后等待響應(yīng)連接。不需要排隊(duì)等候,這樣就加快了http的響應(yīng)時(shí)間。
內(nèi)容編碼由于某些報(bào)文的內(nèi)容過大,因此在傳輸時(shí),為了減少傳輸?shù)臅r(shí)間,會(huì)采取一些壓縮的措施。
例如上面的報(bào)文信息中,Accept-Encoding就定義了內(nèi)容編碼的格式:gzip
有下面幾種方式:
gzip:GNU壓縮格式
compress:UNIX系統(tǒng)的標(biāo)準(zhǔn)壓縮格式
deflate:是一種同時(shí)使用了LZ77和哈弗曼編碼的無損壓縮格式
identity:不進(jìn)行壓縮
多部分對象集合
有的時(shí)候傳輸?shù)膬?nèi)容,不僅僅是一些字符串,還有可能是一些圖片,字符,音樂二進(jìn)制等混雜的內(nèi)容。
這就需要使用多部分對象集合,multipart,例如在使用java編寫web上傳文件的代碼時(shí),需要在form中指定form的編碼格式。
設(shè)置form的enctype屬性的值為multipart/form-data。
這是因?yàn)槟J(rèn)的情況下form使用的編碼格式是:applicatin/x-www-form-urlencoded,這種編碼格式會(huì)把所有的內(nèi)容進(jìn)行編碼,不適合上傳文件這種情況。
這兩種編碼格式的區(qū)別主要是:
multipart/form-data 會(huì)以控件為基準(zhǔn),編碼form中的內(nèi)容。
application/x-www-form-urlencoded 會(huì)把form中的內(nèi)容編碼成鍵值對的形式。
范圍請求有些場景下,http報(bào)文請求一些很大的圖片,但是加載過程很慢。
比如我們登錄一些大圖片的網(wǎng)址,會(huì)發(fā)現(xiàn)有時(shí)候圖片是一塊一塊加載的。
這就是因?yàn)樵O(shè)置了http請求的長度,這樣就可以分塊的加載資源文件。
在請求報(bào)文中使用Range屬性,在響應(yīng)報(bào)文中使用Content-Type屬性都可以指定一定字節(jié)范圍的http請求。
參考[1] URL與URI的區(qū)別:
[2] POST與GET的區(qū)別:
[3] GET與POST的長度限制:
posted @
本文關(guān)鍵詞:圖解HTTP,由筆耕文化傳播整理發(fā)布。
本文編號(hào):106734
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/106734.html