HTTP 每次學(xué)的時(shí)候都感覺有些痛苦,不是痛苦記不住,是感覺零零星星的,看著看著就不知道自己看的是啥了。其實(shí)都是只看到管中窺豹,沒有一個全局的思想,下面就通過一個簡單的顯示網(wǎng)絡(luò)上的圖片展開講一下 HTTP。給你打開一個 HTTP 的大門。
有關(guān)于 HTTP 的詳細(xì)使用文檔。可以在這里點(diǎn)擊查看,如果沒有 HTTP 基礎(chǔ)的朋友或是有些迷糊的同學(xué),建議先通過這個小例子,大概了解一下 HTTP,然后再去仔細(xì)的看每一個點(diǎn)。
通過網(wǎng)絡(luò)獲取一張圖片
這是一張我的壁紙的縮略圖,它的網(wǎng)址為:http://wx1.sinaimg.cn/mw690/986bd8b7gy1fuvkez49nkj211s0lchdt.jpg。
從 URL 出發(fā)
我們都知道,在瀏覽器地址欄中輸入這個網(wǎng)址然后回車會得到一張圖片,那么它是怎么顯示出來的呢?
首先,我們把 URL 進(jìn)行拆分一下,具體得到三個部分:
http:
wx1.sinaimg.cn
/mw690/986bd8b7gy1fuvkez49nkj211s0lchdt.jpg
這三個部分,分別對應(yīng)的是我的壁紙的 URL 中的協(xié)議類型、服務(wù)器地址、具體路徑。具體什么意思呢?
簡單來說就是瀏覽器會向 wx1.sinaimg.cn 發(fā)送一個 Http 請求類型的請求,用于獲取 /mw690/986bd8b7gy1fuvkez49nkj211s0lchdt.jpg 這個路徑的文件。
說了簡單的,再來看看復(fù)雜版的。
GET /mw690/986bd8b7gy1fuvkez49nkj211s0lchdt.jpg HTTP/1.1
Host: wx1.sinaimg.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
這個就是稍微復(fù)雜版的樣子,實(shí)際的內(nèi)容不止這些,我刪去了部分內(nèi)容。全部內(nèi)容就是一個網(wǎng)絡(luò)請求 Request 。這個 Request 就是瀏覽器通過在我們地址欄輸入的內(nèi)容以及它(瀏覽器)協(xié)助我們增加的部分內(nèi)容之后構(gòu)建出來的。如果是客戶端開發(fā)者,在與后臺開發(fā)人員確定了 URL 及具體的請求參數(shù)等信息后,是需要自己通過各種框架或是自己寫來構(gòu)建一個請求的。解釋一下,第一行GET /mw690/986bd8b7gy1fuvkez49nkj211s0lchdt.jpg HTTP/1.1
為請求行,其中包括請求方法,請求資源的路徑,Http 版本,其他部分為請求頭也叫 Request HEAD。
請求行
請求行內(nèi)容較少,就三種類型,分別對應(yīng)請求方法,請求資源的路徑,Http 版本,先看請求資源。
請求資源就是你所請求的目標(biāo)服務(wù)器上的文件路徑,就這么簡單,再來看看 Http 版本,上面的請求行中表明了使用的是 Http 1.1 版本,也是目前使用較多的版本,Http 2.0 已經(jīng)出來了,但還未大規(guī)模應(yīng)用。
重點(diǎn)來了,請求方法,請求方法一共有 8 個,常用的只有那么幾個,如果想了解更多點(diǎn)擊這里。
GET:用于請求指定的頁面信息,不發(fā)送 body;
POST:用于新增或修改服務(wù)器資源,內(nèi)容寫在 body 中。
PUT:用于修改服務(wù)器資源,內(nèi)容放在 body 中。具有冪等性,即:一次和多次請求某一個資源服務(wù)器處理后的結(jié)果應(yīng)為同樣的。
DELETE:用于刪除服務(wù)器資源,不發(fā)送 body。
HEAD:和 GET 請求使用方法相同,但服務(wù)器返回的響應(yīng)報(bào)文中不包含 body。
講到這里,我們算是把請求發(fā)送到服務(wù)器了,緊接著服務(wù)器接收到請求該處理了。
HTTP/1.1 200 OK
Date: Sun, 02 Sep 2018 15:29:53 GMT
Content-Type: image/jpeg
Content-Length: 110989
Cache-Control: max-age=7776000
狀態(tài)行
上面就是服務(wù)器收到我們的請求后,給出的響應(yīng)結(jié)果(Response)。以上就是服務(wù)器響應(yīng)結(jié)果的一部分內(nèi)容。與請求類似,響應(yīng)也有一個叫做狀態(tài)行的東西,就是第一行HTTP/1.1 200 Ok
,其中,HTTP/1.1
表示的 HTTP 的版本,200 表示的響應(yīng)的狀態(tài)碼,Ok 為狀態(tài)碼對應(yīng)的狀態(tài)信息。不過 200 只是針對之前請求圖片的結(jié)果為 成功,還有其他的狀態(tài)碼。下面列出幾個,想了解更多點(diǎn)擊這里。
-
1××,臨時(shí)性消息。
100:目前為止一起正常,客戶端可以繼續(xù)請求;
101:同意客戶端發(fā)來的切換到 HTTP2.0 的請求;
-
2××,成功。
200: ok
201: 成功創(chuàng)建
202: 該請求已被接受處理,但處理尚未完成。
-
3××,重定向
301: 永久性移動;
302: 暫時(shí)性移動;
304: 內(nèi)容未修改;
-
4××,客戶端錯誤。
400: 錯誤的請求,服務(wù)器不會處理。
401: 沒認(rèn)證或認(rèn)證失敗
403: 服務(wù)器拒絕處理;
404: 服務(wù)器找不到對應(yīng)的資源信息;
-
5××,服務(wù)器錯誤。
500: 服務(wù)器內(nèi)部錯誤;
501: 服務(wù)器要么不識別請求方法,要么無法滿足請求。
這里的響應(yīng)結(jié)果,是有 Body 的,Body 就是文章開頭的那張圖片,就不展示了,沒有 Body 的響應(yīng)也是有的,上面也講了,就是當(dāng)請求方法為HEAD
的時(shí)候是不會有響應(yīng) Body 的,只有響應(yīng)HEAD
。
小結(jié)
-
客戶端做了哪些事
瀏覽器將輸入的圖片 URL 解析為請求行;
客戶端自定義構(gòu)建請求頭(HEAD);
組裝數(shù)據(jù)向目標(biāo)服務(wù)器發(fā)送請求;
-
服務(wù)器端做了哪些事
根據(jù)服務(wù)器處理結(jié)果構(gòu)建響應(yīng)(Response)響應(yīng)頭;
根據(jù)響應(yīng)具體消息構(gòu)建響應(yīng)頭(HEAD);
組裝數(shù)據(jù)給客戶端響應(yīng)信息;
HEAD
仔細(xì)看,請求與響應(yīng)他們都離不開一個他們都共有的東西,就是頭部信息(HEAD)請求有請求頭部,響應(yīng)有響應(yīng)頭部,雖然內(nèi)部不一定相同,但他們都是對 Body 或者說具體的請求內(nèi)容的一種描述信息。怎么描述?比如,我的那張壁紙,在響應(yīng)信息里Content-Type: image/jpeg
這個就表示,Body 內(nèi)容為圖片,Content-Length: 110989
這個就表示為內(nèi)容長度為 110989 字節(jié),即為 109 k。HEAD 的信息存儲格式為 <key>: <Value>
的形式。下面就介紹一些常用的HEAD。
Content-Type
Content-Type: text/html;
image/jpeg 表示為 Body 為圖片類型;
text/html 表示 Body 為 Html 文本類型;
x-www-form-urlencoded 表示 Body 純文本表單提交類型
multitype/form-data 表示非純文本(內(nèi)容包含文件或其他非字符串形式的內(nèi)容)表單提交類型。
-
application/json 表示 json 格式的二進(jìn)制類型
- application 表示任意類型的二進(jìn)制數(shù)據(jù),json 則指定了具體的數(shù)據(jù)類型,類似的還有 application/pdf 表示 pdf 格式的二進(jìn)制類型;
Location
Location: https://www.google.com/
在遇到 3×× 的請求狀態(tài)碼(重定向)時(shí)會遇到這個,它表示的內(nèi)容為目標(biāo) URL。
Host
Host: wx1.sinaimg.cn
表示,目標(biāo)服務(wù)器主機(jī),常見的為 Host: wx1.sinaimg.cn
并且后面是可以加端口號的。
Transfer-Encoding
Transfer-Encoding: chunked
用于表示在網(wǎng)絡(luò)傳輸中具體用了什么樣的形式進(jìn)行分塊傳輸。與 Content-Length 不同時(shí)存在。如果它有幾種類型,常用的有 chunked gzip。其中 chunked 用于分段傳輸內(nèi)容,gzip 用于將數(shù)據(jù)壓縮后進(jìn)行傳輸。
Range
Range: bytes=0-5000
用于獲取指定部分內(nèi)容,如果使用上面的 HEAD 作為圖片請求的一部分 HEAD 的話,我可以單獨(dú)獲取 0 到 5000 位置的字節(jié)信息,下面這張圖就是加上這個 HEAD 之后的響應(yīng)結(jié)果。Range 可以用在斷電續(xù)傳、多線程下載。
Accept-Charset
Accept-Charset: utf-8
表示客戶端能接受的數(shù)據(jù)字符編碼格式。
總結(jié)
通過這一個簡單的獲取網(wǎng)絡(luò)上圖片的例子,相信你也了解了一部分關(guān)于 HTTP 的內(nèi)容,趁著這個勁頭再去詳細(xì)看一下開頭提到那個 HTTP 的詳細(xì)使用文檔吧。
下面這個圖,只是我自己畫的一個簡版的關(guān)于 HTTP 的思維導(dǎo)圖,你也可以試試。