個(gè)人主頁(yè):兜里有顆棉花糖
歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng)
收錄于專欄【網(wǎng)絡(luò)編程】
本專欄旨在分享學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評(píng)論區(qū)交流討論??
一、什么是 HTTP 協(xié)議
HTTP協(xié)議全稱超文本傳輸協(xié)議,通過瀏覽器和服務(wù)器進(jìn)行數(shù)據(jù)交互,進(jìn)行超文本數(shù)據(jù)的傳輸,所以HTTP協(xié)議就是規(guī)定了超文本數(shù)據(jù)傳輸所要遵守的規(guī)則。
比如說我們?cè)陔娔X瀏覽器上百度搜索的網(wǎng)址之后,瀏覽器就會(huì)給百度的服務(wù)器發(fā)送一個(gè)請(qǐng)求,而百度服務(wù)器接收到這個(gè)請(qǐng)求之后就會(huì)返回一個(gè)響應(yīng)。這個(gè)響應(yīng)被瀏覽器解析之后就展現(xiàn)成了我們所看到的內(nèi)容(而在這一過程中,瀏覽器可能會(huì)向百度服務(wù)器發(fā)送多個(gè)請(qǐng)求,服務(wù)器會(huì)對(duì)應(yīng)返回多個(gè)響應(yīng), 這些響應(yīng)里就包含了頁(yè)面 HTML, CSS, JavaScript, 圖片, 字體等信息)。
二、HTTP 協(xié)議的工作過程
HTTP協(xié)議工作過程大體可以分為4個(gè)步驟:
-
客戶端發(fā)起請(qǐng)求:客戶端(比如瀏覽器)向服務(wù)器發(fā)送HTTP請(qǐng)求。請(qǐng)求包括請(qǐng)求的方法(GET、POST等),請(qǐng)求的URL,以及其他請(qǐng)求頭信息(比如User-Agent、Accept等)。
-
服務(wù)器響應(yīng)請(qǐng)求:服務(wù)器接收到客戶端的請(qǐng)求后,會(huì)解析請(qǐng)求,并根據(jù)請(qǐng)求的內(nèi)容和要求,生成一個(gè)HTTP響應(yīng)。響應(yīng)包括響應(yīng)狀態(tài)碼(比如200表示成功,404表示未找到等),響應(yīng)頭信息(比如Content-Type、Content-Length等),以及響應(yīng)體(即實(shí)際的內(nèi)容)。
-
傳輸數(shù)據(jù):服務(wù)器將生成的HTTP響應(yīng)發(fā)送回客戶端。這個(gè)過程中,數(shù)據(jù)通過網(wǎng)絡(luò)傳輸,通常使用TCP/IP協(xié)議傳輸。
-
客戶端處理響應(yīng):客戶端接收到服務(wù)器的響應(yīng)后,會(huì)對(duì)響應(yīng)進(jìn)行處理。比如,如果是一個(gè)網(wǎng)頁(yè),瀏覽器會(huì)解析HTML并渲染出頁(yè)面;如果是一個(gè)文件,客戶端可能會(huì)下載并保存文件。
三、HTTP請(qǐng)求
一個(gè)完整的HTTP請(qǐng)求包含請(qǐng)求行
、請(qǐng)求頭
、請(qǐng)求體
、嚴(yán)格來說請(qǐng)求頭和請(qǐng)求體之間還有一個(gè)空行。
- 請(qǐng)求行格式:
<請(qǐng)求方法> <URL> <協(xié)議版本>
- 請(qǐng)求頭格式:
<字段名>: <值>
- 請(qǐng)求體格式:
可選(有的請(qǐng)求有請(qǐng)求體,有的沒有)
URL
URL:唯一資源管理器,即用來描述網(wǎng)絡(luò)上的資源。
下面是完整的URL格式:
查詢字符串
:查詢字符串以?
為開始。另外查詢字符串是鍵值對(duì)格式,鍵值對(duì)之間使用&來分割,鍵和值之間用=分割。鍵和值的含義都是開發(fā)者設(shè)定的,所以如果不理解鍵和值的含義是沒有關(guān)系的。
URL中的部分的格式內(nèi)容是可以省略的:
省略服務(wù)器地址
(即省略ip地址或者域名):此時(shí)就相當(dāng)于當(dāng)前服務(wù)器的地址。我們舉個(gè)例子,如果我們要訪問百度搜索的話,就需要請(qǐng)求中帶有baidu的域名,而響應(yīng)中的內(nèi)容就是百度搜索的HTML語句。之后,這些HTML中又會(huì)觸發(fā)其它的HTTP請(qǐng)求,那么這些后續(xù)觸發(fā)的HTTP請(qǐng)求就可以省略ip地址,使用省略ip地址而觸發(fā)的請(qǐng)求就相當(dāng)于使用和剛才獲取baidu的html一樣的ip地址。
省略端口號(hào)
:端口號(hào)雖然可以省略,但是使用瀏覽器時(shí)會(huì)自動(dòng)加上端口(端口:即要訪問目標(biāo)服務(wù)器的哪個(gè)端口)。如果時(shí)HTTP協(xié)議,自動(dòng)添加的端口是80;如果是HTTPS協(xié)議,自動(dòng)添加的端口是443。(80、144都是知名端口號(hào))。一般當(dāng)商業(yè)產(chǎn)品部署服務(wù)器的時(shí)候都會(huì)遵守上述規(guī)則:即把HTTP服務(wù)器綁定80端口,把HTTPS服務(wù)器綁定443端口,當(dāng)然也可以不遵守,使用別的端口號(hào)就好了。所以省略端口號(hào)之后瀏覽器訪問我們的服務(wù)器時(shí)就不需要顯式指定端口號(hào)了。省略帶層次的路徑
:我們以百度搜索為例,https://www.baidu.com/,如果省略了這里的/
,那么這里訪問的是百度服務(wù)器的主頁(yè)。我們要知道服務(wù)器提供的資源也是分為根節(jié)點(diǎn)和子節(jié)點(diǎn)的,根節(jié)點(diǎn)/
一般就對(duì)應(yīng)的是服務(wù)器的主頁(yè)。查詢字符串(query string)也是可以省略的
:無論是省略還是不省略都可以讓后端根據(jù)實(shí)際情況來對(duì)進(jìn)行處理。
另外:query string中可能會(huì)帶有一些特殊的符號(hào),這些特殊的符號(hào)有一定的含義。比如說空格(%20
)、+(%2B
、?(%3F
)、#(%23
)),當(dāng)然中文也是需要進(jìn)行轉(zhuǎn)換的。轉(zhuǎn)換規(guī)則就是把要轉(zhuǎn)換內(nèi)容的二進(jìn)制的每個(gè)字節(jié)都用16進(jìn)制進(jìn)行表示,然后每個(gè)字節(jié)前面加上%。C++經(jīng)過URL編碼之后就變成了C%2B%2B
。只有經(jīng)過url編碼之后瀏覽器和服務(wù)器才能正確識(shí)別。
這里的方法用來描述請(qǐng)求是干什么的:GET方法可以服務(wù)器中獲取數(shù)據(jù),而Post方法可以向服務(wù)器中傳輸數(shù)據(jù)。
Get請(qǐng)求方法和Post請(qǐng)求方法
獲取百度搜索主頁(yè)的GET請(qǐng)求:
GET請(qǐng)求部分一般是沒有Body的。
雖然GET和POST方法在傳遞數(shù)據(jù)的方式上有所區(qū)別,但在實(shí)際應(yīng)用中,并沒有嚴(yán)格的規(guī)定一定要按照約定來使用。在某些情況下,可以看到開發(fā)者使用GET來提交數(shù)據(jù)或使用POST來獲取數(shù)據(jù)。這樣的用法可能違背了原本的設(shè)計(jì)意圖(get和post方法不必一定遵守之前的語義),但仍然可以工作。
現(xiàn)在來看Post請(qǐng)求:
Post請(qǐng)求的場(chǎng)景一般是用于登錄和上傳。
比如gitee的登錄,請(qǐng)看:
上圖中,中間空出來的是空行,空行下面是就是body。而body內(nèi)容的格式和query string中的格式是類似的,即也是使用的鍵值對(duì)的格式(值
是經(jīng)過了url編碼的形式),在這個(gè)登錄場(chǎng)景中,body內(nèi)容包含了當(dāng)前登錄的用戶名和密碼(密碼是經(jīng)過加密的)的認(rèn)證信息。
下面演示上傳圖片的場(chǎng)景:
上圖中的value值就是把上傳的整個(gè)圖片進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)換成字符串。
由此也可以觀察到Post請(qǐng)求和Get請(qǐng)求之間的一個(gè)區(qū)別就是參數(shù)傳遞位置不同:GET方法將參數(shù)附加在URL的查詢字符串中給服務(wù)器,用戶可以直接觀察到。POST方法將參數(shù)放在請(qǐng)求的主體中(body中)進(jìn)行傳遞,用戶無法直接觀察到。但是無論是在哪里進(jìn)行傳遞,最終都是要傳遞給服務(wù)器的。
Get請(qǐng)求和Post請(qǐng)求時(shí)沒有本質(zhì)區(qū)別的:為什么這么說呢?我們只是從習(xí)慣上來說Get請(qǐng)求把數(shù)據(jù)放到query string中,Post請(qǐng)求把數(shù)據(jù)放到body中,但是數(shù)據(jù)放到哪里都是可以的,我們既可以選擇放到query string中,也可以放到body中,兩者通常是可以相互替代的。
其它請(qǐng)求方法
上面這些請(qǐng)求比較少見,了解一下即可。
請(qǐng)求“報(bào)頭”(header)
請(qǐng)求頭的格式是鍵值對(duì)這樣的結(jié)構(gòu):<字段名>: <值>
(注意鍵和值之間有個(gè):和空格
來進(jìn)行分割)。注意請(qǐng)求頭
中的鍵值對(duì)和url中查詢字符串、請(qǐng)求體body
中的鍵值對(duì)是有區(qū)別的:url中查詢字符串、請(qǐng)求體body
中的鍵值對(duì)是我們開發(fā)者自定義的,而請(qǐng)求頭header
中的鍵值對(duì)是標(biāo)準(zhǔn)規(guī)定的(有些是標(biāo)準(zhǔn)規(guī)定的也有一些是開發(fā)者自定義的鍵值對(duì))。
-
Host:請(qǐng)求要訪問的目標(biāo)服務(wù)器主機(jī)的地址和端口
我們知道請(qǐng)求行中的url中也可以包含主機(jī)的地址和端口,那我們?yōu)槭裁匆贖ost這里再表示一下呢?一般情況下Host中的內(nèi)容和url中是一致的,但是也有不一樣的情況(比如說使用了代理)。 - Content-Length:表示body中的數(shù)據(jù)長(zhǎng)度(單位是字節(jié))。如果有的請(qǐng)求中沒有body的話,這個(gè)字段就可以沒有;如果有body的話就必須有這個(gè)字段(即
Content-Length
),否則就是非法請(qǐng)求了。
Content-Length
可以解決HTTP數(shù)據(jù)的粘包問題,比如說:如果是Get請(qǐng)求沒有body的話,此時(shí)就可以使用可以使用空行來進(jìn)行分割;如果是Post請(qǐng)求有body的話,就可以使用長(zhǎng)度來進(jìn)行區(qū)分。
- Content-Type:表示請(qǐng)求的body中的數(shù)據(jù)格式。
常見的Content-Type值包括:text/plain:純文本類型
、application/json:JSON數(shù)據(jù)類型
、application/x-www-form-urlencoded:HTML表單數(shù)據(jù)類型
、multipart/form-data用于上傳文件等多媒體類型的表單數(shù)據(jù)
、application/xml即XML數(shù)據(jù)類型
、image/jpeg、image/png、image/gif等圖像類型
、application/octet-stream二進(jìn)制流數(shù)據(jù)類型
。
- User-Agent(UA):表示瀏覽器/操作系統(tǒng)的屬性。
- Referer:表示這個(gè)頁(yè)面是從哪個(gè)頁(yè)面跳轉(zhuǎn)過來的。
- Cookie:是瀏覽器本地存儲(chǔ)數(shù)據(jù)的一種機(jī)制。
在瀏覽器訪問服務(wù)器之前,此時(shí)瀏覽器對(duì)服務(wù)器是一無所知的(瀏覽器上沒有任何和服務(wù)器相關(guān)的數(shù)據(jù))。
瀏覽器向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器返回響應(yīng)(比如html、css、json等)并且瀏覽器拿到服務(wù)器返回的數(shù)據(jù)后就可以展示網(wǎng)頁(yè)了。
另外用戶拿到網(wǎng)頁(yè)在操作的過程中也會(huì)產(chǎn)生一些臨時(shí)性的數(shù)據(jù)(這些臨時(shí)數(shù)據(jù)有的可以放到服務(wù)器中方便下次直接獲取到,即使換了一臺(tái)電腦依然有效;有的一些不是很重要的臨時(shí)數(shù)據(jù)就會(huì)放到瀏覽器中存儲(chǔ),下次再次使用時(shí)可以直接用但是換一臺(tái)電腦之后就沒有了)。舉個(gè)例子:比如我們平時(shí)看視頻中可以設(shè)置循環(huán)釋放、聲音設(shè)置、亮度設(shè)置等,當(dāng)下次再次打開這個(gè)視頻的時(shí)候,當(dāng)前設(shè)置和上次設(shè)置就是相同的。
更進(jìn)一步:我們拿循環(huán)播放來進(jìn)行舉例,當(dāng)我們?cè)谝曨l中勾選了循環(huán)播放選項(xiàng)后,這個(gè)操作相當(dāng)于在Cookie中寫入數(shù)據(jù)循環(huán)播放=true
,瀏覽器就會(huì)自動(dòng)存儲(chǔ)這個(gè)數(shù)據(jù)到硬盤中,后續(xù)再次觀看此視頻的時(shí)候,瀏覽器就能自動(dòng)的把這個(gè)數(shù)據(jù)讀出來并寫到http請(qǐng)求中。此時(shí)該視頻網(wǎng)站就知道用戶是否開啟了循環(huán)播放設(shè)置了。
為什么瀏覽器保存數(shù)據(jù)要放到Cookie中而不是硬盤中(比如寫到文件中):因?yàn)橛械木W(wǎng)站是有病毒的,可以入侵我們文件系統(tǒng),這是非常危險(xiǎn)的。
為了保證安全,瀏覽器對(duì)網(wǎng)頁(yè)的功能做出了一些設(shè)置,比如禁止直接訪問硬盤。而Cookie是瀏覽器存儲(chǔ)數(shù)據(jù)的一個(gè)功能(在存儲(chǔ)數(shù)據(jù)這一方面后來有了其它的一些功能,比如當(dāng)你在視頻中勾選循環(huán)播放選項(xiàng)時(shí),瀏覽器不會(huì)將此信息直接存儲(chǔ)到Cookie中,而是將該設(shè)置保存在瀏覽器的本地存儲(chǔ)中)
Cookie中存儲(chǔ)的是什么:按照鍵值對(duì)的方式來存儲(chǔ)字符串,這些鍵值對(duì)往往是從服務(wù)器返回回來的,瀏覽器把這些鍵值對(duì)按照
域名
維度進(jìn)行分類存儲(chǔ)。
這里什么叫按照域名維度:不同的網(wǎng)站的Cookie是不同的,這些Cookie中的內(nèi)容是開發(fā)者自定義的。
Cookie中一個(gè)典型的使用場(chǎng)景:在Cookie存儲(chǔ)的中眾多鍵值對(duì)中有一個(gè)重要的鍵值對(duì)就是用來表示用戶的身份信息(表示當(dāng)前請(qǐng)求是來自哪個(gè)用戶)。舉個(gè)栗子:登錄一個(gè)網(wǎng)站之后再次訪問該網(wǎng)站的其它頁(yè)面則不需要重新登錄;關(guān)閉電腦之后后續(xù)再訪問該網(wǎng)站仍然不需要重新登錄。
總結(jié)一下Cookie:Cookie是從服務(wù)器返還給客戶端(瀏覽器)的,在客戶端(瀏覽器)進(jìn)行保存。Cookie中的內(nèi)容是鍵值對(duì)(開發(fā)者自己定義)形式的數(shù)據(jù),每個(gè)域名都會(huì)有自己的一組Cookie。Cookie中的內(nèi)容用來做什么:后續(xù)我們?cè)俅卧L問相同的網(wǎng)站時(shí),就會(huì)在請(qǐng)求中帶上Cookie(瀏覽器會(huì)自動(dòng)的把相應(yīng)的Cookie包包含在請(qǐng)求中),服務(wù)器就會(huì)使用Cookie來識(shí)別客戶端并獲取客戶端的詳情信息。
請(qǐng)求“正文”(body)
正文中的內(nèi)容格式和header中的Content-Type密切相關(guān)。通常用于傳輸一些附加的、非必要的數(shù)據(jù),例如表單數(shù)據(jù)、JSON數(shù)據(jù)或者上傳的文件等。
請(qǐng)求體的常見格式如下:
- 表單數(shù)據(jù):使用
"application/x-www-form-urlencoded"或"multipart/form-data"
格式。表單數(shù)據(jù)可以通過鍵值對(duì)的形式包含在請(qǐng)求體中。 - JSON數(shù)據(jù):使用
"application/json"
格式。請(qǐng)求體中的數(shù)據(jù)以JSON格式進(jìn)行編碼,用于傳輸結(jié)構(gòu)化的數(shù)據(jù)。 - 文件上傳:使用
"multipart/form-data"
格式。請(qǐng)求體中可以包含文件數(shù)據(jù),用于文件上傳。 - 自定義格式:開發(fā)人員可以定義自己的格式,例如XML格式等。
在HTTP請(qǐng)求過程中,請(qǐng)求體的使用是完全可選的,并不是所有的請(qǐng)求都需要請(qǐng)求體。具體是否需要請(qǐng)求體以及請(qǐng)求體的內(nèi)容和格式,取決于服務(wù)端的要求和開發(fā)人員的需求。
本文到這里就結(jié)束了,希望友友們可以支持一下一鍵三連哈。嗯,就到這里吧,再見啦!??!文章來源:http://www.zghlxwxcb.cn/news/detail-818014.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-818014.html
到了這里,關(guān)于【計(jì)算機(jī)網(wǎng)絡(luò)】應(yīng)用層——HTTP 協(xié)議(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!