大家好,我是軍哥
我們學(xué)知識(shí)大致都會(huì)經(jīng)歷三個(gè)階段。第一階段是what,了解一個(gè)東西是什么,第二階段是how,了解一個(gè)東西如何使用。第三階段是why,為什么要這么用。當(dāng)你達(dá)到第三層境界才能說(shuō)明你對(duì)這個(gè)東西理解透徹。
同理,對(duì)于一個(gè)做web開(kāi)發(fā)的程序員來(lái)說(shuō),沒(méi)有什么比自己寫(xiě)一個(gè)web服務(wù)器或web框架更能了解web編程的本質(zhì)了。
這個(gè)系列是我的一位讀者朋友江湖十年寫(xiě)的,他過(guò)來(lái)問(wèn)我可不可以投稿在公眾號(hào)??赐曛缶土ⅠR答應(yīng)了。大家都喜歡看沒(méi)營(yíng)養(yǎng)的爽文,雖然這種干貨型的技術(shù)文看的人少,但是能幫助對(duì)web開(kāi)發(fā)感興趣的人就值了。
系列文章工作分為8章,除了這篇,次條到第8條都是,你也不可能一天看到,先收藏著,看看你能不能一周也寫(xiě)一個(gè)web服務(wù)器出來(lái)。
本教程使用 Python 語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)易版的 Web 服務(wù)器,從 Web 開(kāi)發(fā)基礎(chǔ)開(kāi)始講解,不使用任何第三方庫(kù)或框架,通過(guò)實(shí)現(xiàn)一個(gè) Todo List 應(yīng)用來(lái)還原 Web 開(kāi)發(fā)的本質(zhì)。
Python、HTML、CSS 語(yǔ)法基礎(chǔ),對(duì) Web 開(kāi)發(fā)基本概念有所了解。
本教程為入門(mén)級(jí),主要適合準(zhǔn) Python Web 開(kāi)發(fā)者或?qū)?Web 開(kāi)發(fā)理解不是很透徹的同學(xué)。
本教程并不會(huì)使用如 Django、Flask 等常見(jiàn) Python Web 開(kāi)發(fā)框架,也不會(huì)使用任何其他第三方庫(kù),甚至?xí)梦募?lái)替代數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。其目的是為了簡(jiǎn)化一些對(duì)初學(xué)者來(lái)說(shuō)看似復(fù)雜的概念,使用更少的依賴(lài)從零開(kāi)發(fā)一個(gè) Python Web 服務(wù)器。以便讀者能夠更深刻的理解 Web 開(kāi)發(fā)。
Web 開(kāi)發(fā)技術(shù)一直在高速發(fā)展,各種新奇概念與框架層出不窮,尤其在 Web 前端領(lǐng)域,幾年前還是 jQuery 的天下,而如今在 Vue、React 等框架面前也顯得廉頗老矣。
不過(guò),雖然各種框架技術(shù)日新月異,但 Web 開(kāi)發(fā)的核心概念與本質(zhì)依舊不曾改變,本教程將通過(guò)一個(gè) Todo List 應(yīng)用帶你探索 Web 開(kāi)發(fā)基本原理,只有真正明白了 Web 開(kāi)發(fā)的核心基礎(chǔ),才能更輕松的應(yīng)對(duì)新框架與技術(shù)。
我們常見(jiàn)的軟件種類(lèi)有桌面軟件、移動(dòng) APP以及網(wǎng)頁(yè)應(yīng)用等,Web 開(kāi)發(fā)通常就是在開(kāi)發(fā)網(wǎng)頁(yè)應(yīng)用。桌面軟件、移動(dòng) APP 需要先安裝在 Windows、Android 等宿主機(jī)才能使用,每個(gè)客戶(hù)端每次升級(jí)更新軟件時(shí)都需要重新下載并安裝。而 Web 應(yīng)用所依賴(lài)的客戶(hù)端是瀏覽器,實(shí)際數(shù)據(jù)都存儲(chǔ)在遠(yuǎn)程服務(wù)器端,如果應(yīng)用需要升級(jí),那么只需要升級(jí)服務(wù)器,所有用戶(hù)通過(guò)瀏覽器打開(kāi)網(wǎng)頁(yè)時(shí)都將實(shí)時(shí)獲取最新的數(shù)據(jù),這也是 Web 開(kāi)發(fā)能夠流行起來(lái)的很重要的原因。
要學(xué)習(xí) Web 開(kāi)發(fā),首先要明白什么是 HTTP 協(xié)議,因?yàn)?Web 開(kāi)發(fā)就是建立在 HTTP 協(xié)議之上的。
在瀏覽器地址欄輸入網(wǎng)址 https://www.jd.com/
將得到京東商城首頁(yè)。我們?cè)跒g覽器頁(yè)面中看到的所有數(shù)據(jù)都是服務(wù)器通過(guò) HTTP 協(xié)議傳輸過(guò)來(lái)的。
HTTP 協(xié)議中文叫超文本傳輸協(xié)議,可以拆分成三部分理解:超文本、傳輸、協(xié)議。
所謂超文本就是 HTML、CSS、圖片、視頻等內(nèi)容的集合。傳輸既超文本內(nèi)容從瀏覽器(客戶(hù)端)到服務(wù)器或從服務(wù)器到瀏覽器之間的傳輸過(guò)程。而協(xié)議是規(guī)范,大家約定俗成的規(guī)約既是協(xié)議。
HTTP 基于請(qǐng)求 —— 響應(yīng)模型,瀏覽器向服務(wù)器的某個(gè)網(wǎng)址發(fā)起請(qǐng)求,服務(wù)器響應(yīng)瀏覽器對(duì)應(yīng)的資源。以下就是一個(gè) HTTP 請(qǐng)求 —— 響應(yīng)的模型圖。
左側(cè)是瀏覽器,右側(cè)是服務(wù)器。瀏覽器和服務(wù)器之間通訊是通過(guò)文本傳輸來(lái)完成的。瀏覽器發(fā)起請(qǐng)求時(shí)發(fā)送的數(shù)據(jù)叫作請(qǐng)求報(bào)文,得到的服務(wù)端響應(yīng)的數(shù)據(jù)叫作響應(yīng)報(bào)文。下圖示展示了請(qǐng)求報(bào)文和響應(yīng)報(bào)文的格式。
根據(jù)圖示可以看到,無(wú)論是請(qǐng)求報(bào)文還是響應(yīng)報(bào)文基本都分為四個(gè)部分,每個(gè)部分之間以 \r\n
作為換行分隔符。
請(qǐng)求報(bào)文包含請(qǐng)求行、報(bào)文首部、空行、報(bào)文主體四個(gè)部分。
響應(yīng)報(bào)文包含狀態(tài)行、報(bào)文首部、空行、報(bào)文主體四個(gè)部分。
在請(qǐng)求報(bào)文中,請(qǐng)求行和報(bào)文首部可以看成一個(gè)整體叫作請(qǐng)求頭,報(bào)文主體又叫請(qǐng)求體。
在響應(yīng)報(bào)文中,狀態(tài)行和報(bào)文首部可以看成一個(gè)整體叫作響應(yīng)頭,報(bào)文主體又叫響應(yīng)體。
如何在 Chrome 瀏覽器中查看請(qǐng)求與響應(yīng)的報(bào)文信息呢?瀏覽器頁(yè)面任意位置點(diǎn)擊鼠標(biāo)右鍵 —— 選擇檢查,就能夠在頁(yè)面底部顯示 Chrome 開(kāi)發(fā)者工具。點(diǎn)擊 Elements
選項(xiàng)卡,你就能夠看到網(wǎng)頁(yè)的源代碼,也就是服務(wù)器的響應(yīng)數(shù)據(jù)。
點(diǎn)擊 Network
選項(xiàng)卡,就能夠看到所有請(qǐng)求、響應(yīng)記錄。
每一行記錄即為一個(gè)請(qǐng)求,為什么只是在地址欄里輸入了 https://www.jd.com/
會(huì)出現(xiàn)這么多請(qǐng)求呢?我們知道,HTML 中不止可以寫(xiě)簡(jiǎn)單的文本標(biāo)簽,還可以寫(xiě) img
、video
等多媒體標(biāo)簽加載圖片或視頻,以及 link
、script
等標(biāo)簽來(lái)加載 CSS 樣式 和 JavaScript 腳本。瀏覽器在得到服務(wù)器的第一個(gè)響應(yīng)時(shí),會(huì)檢查服務(wù)器返回的 HTML 頁(yè)面,如果頁(yè)面源碼中包含這些特殊的標(biāo)簽,瀏覽器就會(huì)針對(duì)每一個(gè)標(biāo)簽專(zhuān)門(mén)發(fā)起一次請(qǐng)求。
點(diǎn)擊第一個(gè)請(qǐng)求,在右側(cè)將會(huì)顯示該請(qǐng)求及響應(yīng)信息。找到 Request Headers
點(diǎn)擊右側(cè)的 view source
,將會(huì)看到此次請(qǐng)求的請(qǐng)求頭信息。
第一行 GET / HTTP/1.1
即為請(qǐng)求行。它由三個(gè)部分組成:請(qǐng)求方法、請(qǐng)求地址、HTTP 協(xié)議版本號(hào),分別對(duì)應(yīng) GET
、/
、HTTP/1.1
。每個(gè)部分之間通過(guò)一個(gè)空格隔開(kāi)。
HTTP 請(qǐng)求方法有很多,不過(guò)最常見(jiàn)的只有四種:POST
、DELETE
、PUT
、GET
分別對(duì)應(yīng)增、刪、改、查四個(gè)操作。由于我們只是想查看京東首頁(yè),所以這里發(fā)送的是 GET
請(qǐng)求。
請(qǐng)求地址 /
代表首頁(yè),你可能看過(guò)如 /index
、/index.html
等類(lèi)似的地址,其實(shí)這只是一個(gè)約定俗成的做法,它們都代表首頁(yè)。
現(xiàn)在最常用的 HTTP 版本即為 1.1
。雖然 HTTP 2.0 早已發(fā)布,不過(guò)目前來(lái)說(shuō)普及率依舊不是很高。所以現(xiàn)在大可不必糾結(jié)版本的問(wèn)題。
從第二行開(kāi)始,所有內(nèi)容都是諸如 Key: Value
這種鍵值對(duì)的形式組合成的,我們管每一組鍵值對(duì)都叫作請(qǐng)求首部字段,這些首部字段加在一起就是請(qǐng)求的報(bào)文首部,一般會(huì)直接叫請(qǐng)求頭。
其中最重要的請(qǐng)求首部字段就是 Host: www.jd.com
這一行,因?yàn)橹挥羞@一行是 HTTP 協(xié)議明確規(guī)定為必傳的首部字段,其他請(qǐng)求首部字段都是非必傳字段。Host: www.jd.com
的作用是當(dāng)服務(wù)器上部署了多個(gè)網(wǎng)站,那么服務(wù)器就會(huì)根據(jù)這一行的信息來(lái)確定瀏覽器到底想訪問(wèn)哪個(gè)網(wǎng)站。
Connection: keep-alive
代表長(zhǎng)連接,User-Agent
標(biāo)識(shí)了瀏覽器信息,Accept
代表瀏覽器能夠接收的報(bào)文格式,其他的請(qǐng)求首部字段可以等我們用到了再做說(shuō)明。
在 HTTP 請(qǐng)求報(bào)文中,還缺少一個(gè)空行和請(qǐng)求體是我們目前沒(méi)有看到的。實(shí)際上雖然我們是點(diǎn)擊瀏覽器的 view source
功能來(lái)查看請(qǐng)求報(bào)文信息,但它仍然是瀏覽器處理過(guò)的數(shù)據(jù),并不是原始數(shù)據(jù),所以空行是看不到的。而此次請(qǐng)求為 GET
請(qǐng)求,通常 GET
請(qǐng)求是沒(méi)有請(qǐng)求體的,所以請(qǐng)求體被省略了。
一個(gè) HTTP GET
請(qǐng)求大概長(zhǎng)這樣:
GET / HTTP/1.1
Host: www.jd.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
一個(gè) HTTP POST
請(qǐng)求大概長(zhǎng)這樣:
POST /login HTTP/1.1
Host: www.jd.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
username=test&password=pass
上面 POST
請(qǐng)求示例中 username=test&password=pass
即為請(qǐng)求體。
需要注意,以上請(qǐng)求報(bào)文中每一個(gè)換行都是用 \r\n
來(lái)標(biāo)識(shí)的,這一點(diǎn)在后面實(shí)際開(kāi)發(fā)的章節(jié)中就能體會(huì)到。
分析完請(qǐng)求報(bào)文,接下來(lái)分析下響應(yīng)報(bào)文。找到 Response Headers
同樣點(diǎn)擊右側(cè)的 view source
,將會(huì)看到此次請(qǐng)求的響應(yīng)頭信息。
第一行 HTTP/1.1 200 OK
即為狀態(tài)行。它同樣由三部分組成:HTTP協(xié)議版本號(hào)、狀態(tài)碼、當(dāng)前狀態(tài)碼對(duì)應(yīng)的原因短語(yǔ),分別對(duì)應(yīng) HTTP/1.1
、200
、OK
。每個(gè)部分之間仍然通過(guò)一個(gè)空格隔開(kāi)。
其中狀態(tài)碼用來(lái)告知服務(wù)器返回的響應(yīng)狀態(tài),為一個(gè)數(shù)字。狀態(tài)碼大概分為四類(lèi):2XX
、3XX
、4XX
、5XX
,分別對(duì)應(yīng)成功、重定向、客戶(hù)端錯(cuò)誤、服務(wù)端錯(cuò)誤。所以狀態(tài)碼為 200
表示請(qǐng)求成功。
原因短語(yǔ) OK
其實(shí)并不是很重要,它主要是給客戶(hù)端返回一個(gè)人類(lèi)可讀的短語(yǔ),來(lái)標(biāo)識(shí)請(qǐng)求結(jié)果,對(duì)瀏覽器來(lái)說(shuō)沒(méi)什么作用。
響應(yīng)首部字段同樣是 Key: Value
這種鍵值對(duì)形式,并且有些是和請(qǐng)求首部字段一樣的,稱(chēng)為通用首部字段,如 Connection: keep-alive
同樣存在于響應(yīng)首部字段。還有些字段是和請(qǐng)求首部字段搭配著使用的,如你所見(jiàn) Content-Type
字段就是搭配請(qǐng)求首部字段中的 Accept
來(lái)使用的,Accept
是瀏覽器用來(lái)告訴服務(wù)器它能夠接收的數(shù)據(jù)格式,而 Content-Type: text/html
標(biāo)識(shí)了服務(wù)器返回的數(shù)據(jù)格式為 html
。其他的響應(yīng)首部字段可以等我們用到了再做說(shuō)明。
同樣的,響應(yīng)報(bào)文中的空行并不會(huì)在瀏覽器中展現(xiàn)出來(lái),不過(guò)響應(yīng)體是可以在瀏覽器中看到的。
當(dāng)前請(qǐng)求的響應(yīng)體實(shí)際上就是服務(wù)器返回的 HTML
源碼。
一個(gè) HTTP 響應(yīng)大概長(zhǎng)這樣:
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/html
<html>XXX</html>
介紹完 HTTP 協(xié)議基礎(chǔ),我們?cè)賮?lái)簡(jiǎn)單介紹下 URL
。
京東首頁(yè)的網(wǎng)址是 https://www.jd.com/
,這就是一個(gè) URL
。URL
中文叫作統(tǒng)一資源定位符。URL
的作用是在網(wǎng)絡(luò)中唯一的標(biāo)記一個(gè)資源。
你可能聽(tīng)說(shuō)過(guò) URI
,實(shí)際上 URL
是 URI
的一個(gè)子集。在基礎(chǔ)學(xué)習(xí)階段,我們并不需要弄清楚它們之間到底有什么差別,只需要把我們常見(jiàn)的網(wǎng)址統(tǒng)稱(chēng)為 URL
即可。
一個(gè) URL
的完整格式如下:
scheme://user:passwd@host:port/path?query#fragment
每一個(gè)部分代表含義如下:
scheme
:協(xié)議名,表示資源使用哪種協(xié)議,http
就代表了 HTTP 協(xié)議,file
代表文件協(xié)議。
://
:這個(gè)是固定寫(xiě)法,記住就好,沒(méi)必要深究。
user:passwd@
:身份信息,表示訪問(wèn)主機(jī)時(shí)需要提供的用戶(hù)名和密碼,但這種將隱私信息完全暴露在外部的作法已經(jīng)幾乎沒(méi)人使用了。
host:port
:表示資源所在的主機(jī)名和端口號(hào)。主機(jī)名為 IP 地址或域名,必須要有,HTTP 協(xié)議默認(rèn)端口號(hào)是 80
,可以省略,其他端口號(hào)則不可省略。
path
:標(biāo)識(shí)資源所在位置。它采用類(lèi)似 Unix 系統(tǒng)的目錄風(fēng)格,必須以 /
開(kāi)頭,如果是多級(jí)路徑,可以寫(xiě)成 /a/b/c
這種形式。
query
:查詢(xún)參數(shù),在路徑之后第一個(gè) ?
開(kāi)始(不包含?
)到 #
之前結(jié)束,所有的內(nèi)容都是查詢(xún)參數(shù),一個(gè)參數(shù)的格式為 key=value
,如果存在多個(gè)參數(shù),中間用 &
隔開(kāi)。假如我們需要對(duì)數(shù)據(jù)做分頁(yè)處理就可以使用這個(gè)參數(shù),如 page=1&offset=20
表示需要獲取第一頁(yè)的數(shù)據(jù),每頁(yè)數(shù)據(jù) 20 條。這時(shí)候服務(wù)器端就可以解析到這個(gè)參數(shù)并返回對(duì)應(yīng)的數(shù)據(jù)。
fragment
:最后一部分為片段標(biāo)識(shí)符。也可以將其叫做錨點(diǎn),從 #
開(kāi)始,瀏覽器可以根據(jù)錨點(diǎn)跳轉(zhuǎn)到頁(yè)面指定位置,但這個(gè)參數(shù)是不會(huì)被發(fā)送到服務(wù)器端的,所以開(kāi)發(fā)服務(wù)器端通常不太需要關(guān)心。
下面通過(guò)對(duì)一個(gè)實(shí)際的 URL
地址進(jìn)行分析來(lái)加強(qiáng)理解。
以下圖示為在京東首頁(yè)搜索 Python書(shū)籍
后瀏覽器地址欄 URL
截圖。為了能夠更清晰的說(shuō)明問(wèn)題 URL
部分略有刪減。
我們可以將 URL
復(fù)制出來(lái):
https://search.jd.com/Search?keyword=python%E4%B9%A6%E7%B1%8D&enc=utf-8
以上 URL
按標(biāo)準(zhǔn)格式拆分如下:
scheme: https
host:port: search.jd.com
path: /Search
query: keyword=python%E4%B9%A6%E7%B1%8D&enc=utf-8
你應(yīng)該已經(jīng)發(fā)現(xiàn)上面復(fù)制出來(lái)的 URL
和截圖中的有些不同。
首先我們復(fù)制出來(lái)的 URL
是以 https
開(kāi)頭,而瀏覽器中卻是以 search
開(kāi)頭,其實(shí)這是瀏覽器為了讓 URL
更加可讀,而將 https://
隱藏了,實(shí)際上它仍然是存在的。
你可能有個(gè)疑惑,我們上面一直在介紹 HTTP 協(xié)議,一個(gè)完整的 URL
是以 http
開(kāi)頭的。但實(shí)際上京東網(wǎng)站的 URL
都是以 https
開(kāi)頭的。其實(shí) https
是基于 http
的,只是在 http
的基礎(chǔ)上又加了一個(gè)安全套接層,默認(rèn)端口 443
,HTTP 協(xié)議傳輸數(shù)據(jù)都是明文傳輸,HTTPS 協(xié)議傳輸數(shù)據(jù)是經(jīng)過(guò)加密的,所以使得數(shù)據(jù)的傳輸更加安全,僅此而已。本教程不會(huì)使用 HTTPS 協(xié)議,故此不做過(guò)多講解。
還有一個(gè)較大的差異就是在瀏覽器地址欄中看到的查詢(xún)參數(shù) Python書(shū)籍
復(fù)制出來(lái)以后就變成了 python%E4%B9%A6%E7%B1%8D
。這是 URL
編碼造成的,通常在 URL
中只能使用 ASCII 碼,并且 URL
本身會(huì)使用如 ?
、&
等符號(hào)作為分隔符。這就導(dǎo)致了很多特殊符號(hào)或者 ASCII 以外的字符(如中文)不能夠直接使用,所以就規(guī)定了一種轉(zhuǎn)碼規(guī)范,將不能直接用于 URL
的字符通過(guò)轉(zhuǎn)義操作使其變?yōu)榭捎米址?。這就是 書(shū)籍
兩個(gè)字符變成了 %E4%B9%A6%E7%B1%8D
的原因。在瀏覽器地址欄中能夠正常顯示同樣是瀏覽器為了讓 URL
更加可讀做的特殊處理。URL 轉(zhuǎn)義具體規(guī)則可以查看相關(guān)文檔進(jìn)行學(xué)習(xí)。
多個(gè)計(jì)算機(jī)之間通訊靠的是網(wǎng)絡(luò)協(xié)議,最早的計(jì)算機(jī)廠商生產(chǎn)的計(jì)算機(jī)只能跟自家的計(jì)算機(jī)通訊,為讓所有計(jì)算機(jī)之間都能夠通訊就有了 TCP/IP 協(xié)議。這就比如幾個(gè)人對(duì)話,有的說(shuō)漢語(yǔ)、有的說(shuō)英語(yǔ)、有的說(shuō)日語(yǔ),大家誰(shuí)也聽(tīng)不懂其他人說(shuō)話,所以最后大家都規(guī)定用一種語(yǔ)言來(lái)交流一樣。
TCP/IP 協(xié)議并不是單個(gè)的協(xié)議,它是一個(gè)協(xié)議族,包含了很多種網(wǎng)絡(luò)通訊協(xié)議,HTTP 協(xié)議也在其中。在網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間如果需要通訊,就要知道對(duì)方在哪,所以就有了 IP 地址。就像我們要給別人發(fā)快遞,那么就要知道對(duì)方的家庭住址一樣?,F(xiàn)在常用的 IP 地址為 IPv4 版本,格式如 192.168.3.14
,最新版本是 IPv6,格式如 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
。
有了 IP 地址還不夠,就像你把快遞郵寄到一個(gè)家庭住址,但家里有五口人,你還要確定這個(gè)快遞是寄給誰(shuí)的。端口的作用就是干這個(gè)的。計(jì)算機(jī)通過(guò)端口號(hào)區(qū)分收到的信息該轉(zhuǎn)發(fā)給哪個(gè)軟件。
IP 地址加上端口號(hào)就是上面介紹的 URL
中 host:port
部分,如 192.168.3.14:80
。但 IP 地址是一串?dāng)?shù)字,不容易記住,所以就有了域名。www.jd.com
就是京東的域名。我們?cè)跒g覽器中輸入這個(gè)域名時(shí),計(jì)算機(jī)會(huì)自動(dòng)將其轉(zhuǎn)換成 IP 地址加端口號(hào)的形式。這個(gè)轉(zhuǎn)換過(guò)程是通過(guò)一個(gè)叫 DNS 解析的技術(shù)。它能夠?qū)⒂蛎?IP 之間的關(guān)系做綁定,知道了域名它就能查出其對(duì)應(yīng)的 IP 地址是多少。
HTTP 協(xié)議是建立在 TCP/IP 協(xié)議之上的,HTTP 的數(shù)據(jù)傳輸依靠的是 TCP
協(xié)議??偨Y(jié)起來(lái)就是 TCP
用來(lái)傳輸數(shù)據(jù),HTTP
用來(lái)規(guī)范數(shù)據(jù)傳輸格式。
從瀏覽器地址欄輸入網(wǎng)址 https://www.jd.com/
到看見(jiàn)京東網(wǎng)站首頁(yè)經(jīng)歷了什么?
瀏覽器從地址欄獲取 URL
瀏覽器或操作系統(tǒng)通過(guò) DNS 解析將 URL 中域名和端口號(hào)解析成對(duì)應(yīng)的 IP 地址和端口號(hào)
瀏覽器通過(guò) TCP 與服務(wù)器建立連接
瀏覽器向服務(wù)器發(fā)送請(qǐng)求報(bào)文
服務(wù)器收到請(qǐng)求報(bào)文后做對(duì)應(yīng)的處理,將處理結(jié)果組裝成響應(yīng)報(bào)文返回給瀏覽器
瀏覽器解析響應(yīng)報(bào)文,渲染頁(yè)面
以上就是從瀏覽器地址欄輸入網(wǎng)址 https://www.jd.com/
到看見(jiàn)京東網(wǎng)站首頁(yè)所經(jīng)歷的過(guò)程概述。
如果你對(duì) Web 開(kāi)發(fā)完全零基礎(chǔ),看了以上我對(duì) HTTP 協(xié)議的簡(jiǎn)介,感覺(jué)不是很明白的話,那么我推薦你可以看一本叫作《圖解HTTP》的書(shū),看完后再來(lái)學(xué)習(xí)本教程能夠達(dá)到事半功倍的效果。
本教程項(xiàng)目開(kāi)發(fā)環(huán)境如下:
Python:Python3.7
瀏覽器:Chrome83
開(kāi)發(fā)工具:PyCharm 2020.1
操作系統(tǒng):macOS 10.15
有 Python 基礎(chǔ)的同學(xué)想必搭建開(kāi)發(fā)環(huán)境肯定不在話下,所以具體搭建過(guò)程這里不再做過(guò)多介紹,需要強(qiáng)調(diào)的一點(diǎn)是瀏覽器我只推薦 Chrome 或者 Firefox,這樣能夠得到更好的開(kāi)發(fā)體驗(yàn)。
聯(lián)系作者:
微信:jianghushinian
聯(lián)系客服