HTTP 協(xié)議與網(wǎng)站基本開發(fā)流程
上節(jié)課我們學(xué)習(xí)了 Web 開發(fā)中必備的一些 HTML/CSS/JS 這一節(jié)中我們會繼續(xù)介紹下 Web 開發(fā)中的一些基礎(chǔ)知識,包括常用術(shù)語、HTTP 協(xié)議、
1. Web 服務(wù)中的常用術(shù)語
在正式開始 Django 項目開發(fā)之前,我們需要掌握一些 Web 開發(fā)中常見的術(shù)語。Web 服務(wù)和網(wǎng)站在某種程度上是等價的,因此后面描述時并不區(qū)分這兩個概念。
-
客戶端:用戶主機上運行并連接到互聯(lián)網(wǎng)的應(yīng)用程序,一般而言是指瀏覽器。用戶通過瀏覽器實現(xiàn)和網(wǎng)站的數(shù)據(jù)交互;
-
服務(wù):服務(wù)主要接受和處理來自互聯(lián)網(wǎng)的請求。服務(wù)一般部署在某臺主機上,監(jiān)聽某個端口,等待用戶請求;
-
域名:用于標識一個或者多個 IP 地址;
-
IP:互聯(lián)網(wǎng)協(xié)議地址?;ヂ?lián)網(wǎng)上的每臺計算機都有一個 IP 地址,用于識別和通信。IP 地址由 4 組數(shù)組組成,以小數(shù)點分割,這些被稱為邏輯地址;
-
DNS:域名系統(tǒng)服務(wù),主要用于網(wǎng)絡(luò)域名與 IP 地址的相互轉(zhuǎn)換;
-
ISP:互聯(lián)網(wǎng)服務(wù)提供商;
-
TCP/IP:傳輸控制協(xié)議 / 網(wǎng)際協(xié)議,是當前互聯(lián)網(wǎng)使用的主要通信協(xié)議。
除了上述基礎(chǔ)術(shù)語之外,我們還有兩個非常重要的知識點需要掌握,分別是 HTTP 協(xié)議和 URL 的組成。
1.1 HTTP 協(xié)議
HTTP 協(xié)議,即超文本傳輸協(xié)議,是一個客戶端終端(用戶)和服務(wù)器端(網(wǎng)站)請求和應(yīng)答的標準。這也是 Web 開發(fā)基礎(chǔ)。因為大部分網(wǎng)站或者 Web 服務(wù)的前后端交互幾乎都是走 HTTP 請求。HTTP 協(xié)議定義 Web 客戶端如何從 Web 服務(wù)器請求 Web 頁面,以及服務(wù)器如何把 Web 頁面?zhèn)魉徒o客戶端。
HTTP 協(xié)議采用了請求 / 響應(yīng)模型??蛻舳讼蚍?wù)器發(fā)送一個請求報文,請求報文包含請求的方法、URL、協(xié)議版本、請求頭部和請求數(shù)據(jù)。服務(wù)器以一個狀態(tài)行作為響應(yīng),響應(yīng)的內(nèi)容包括協(xié)議的版本、成功或者錯誤代碼、服務(wù)器信息、響應(yīng)頭部和響應(yīng)數(shù)據(jù)。
HTTP 協(xié)議有如下特點:
-
簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。由于 HTTP 協(xié)議簡單,使得 HTTP 服務(wù)器的程序規(guī)模小,因而通信速度很快;
-
靈活:HTTP 允許傳輸任意類型的數(shù)據(jù)對象;
-
無連接:無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間;
-
無狀態(tài):HTTP 協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
1.1.1 HTTP 常見請求
在 HTTP/1.1 協(xié)議中共定義了八種方法(也叫 “動作”)來以不同方式操作指定的資源,目前我們比較常見和常用的有以下四個:
-
GET 請求:向指定的資源發(fā)出 “顯示 “請求。使用 GET 方法應(yīng)該只用在讀取數(shù)據(jù),而不應(yīng)當被用于產(chǎn)生 “副作用” 的操作中。一般在瀏覽器中直接敲擊 URL 并按回車鍵是執(zhí)行的 GET 請求;
-
POST 請求:向指定資源提交數(shù)據(jù)進行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST 請求可能會導(dǎo)致新的資源的建立和 / 或已有資源的修改;
-
PUT 請求:從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容;
-
DELETE 請求:請求服務(wù)器刪除指定的頁面。
這四種請求和數(shù)據(jù)的增刪改查(CRUD) 可以看成是相對應(yīng)的,一般在設(shè)計 URL 接口時,也會默認使用這樣特性,讓 GET 請求對應(yīng)查詢數(shù)據(jù)、POST 請求對應(yīng)數(shù)據(jù)的新增等等,這樣的接口設(shè)計出來才會具備良好的 Restful 風(fēng)格。
1.1.2 HTTP 狀態(tài)碼
HTTP 請求通常會返回一個狀態(tài)碼,常見的 HTTP 狀態(tài)碼有:
-
2xx:正確類。表示用戶請求被正確接收、理解和處理;
- 200 - 請求成功;
-
3xx:重定向類。表示沒有請求成功,必須采取進一步的動作;
-
301 - 資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它 URL;
-
302 - 資源臨時移動,資源只是臨時被移動,客戶端應(yīng)繼續(xù)使用原有 URI ;
-
-
4xx:客戶端錯誤。表示客戶端提交的請求包含語法錯誤或不能正確執(zhí)行;
-
400 - 往往是 Bad Request 錯誤。是指請求的方法不對;
-
401 - 用戶沒有訪問權(quán)限,需要進行身份認證;
-
403 - 禁止訪問;
-
404 - 資源不存在,Not Found 錯誤;
-
-
5xx:服務(wù)端錯誤。一般是說明服務(wù)器出現(xiàn)了問題;
- 503 - 服務(wù)端錯誤,一般是服務(wù)器內(nèi)部處理異常。
實操: 用 curl
命令模擬發(fā)送 HTTP 請求。
[root@server ~]# curl -I -XGET http://www.baidu.com/index.html
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 2381
Content-Type: text/html
Date: Sun, 08 Mar 2020 14:36:01 GMT
Etag: "588604c8-94d"
Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
1.2 URL 介紹
URL 的中文名稱為統(tǒng)一資源定位符。簡單來說,它就是一個地址,是我們請求互聯(lián)網(wǎng)上某一個資源地址或者某一個服務(wù)接口的完整路徑。我們找一個網(wǎng)站的實際 URL 例子,來說明下完整 URL 的組成部分:
這個慕課網(wǎng)上的完整的 URL 地址為: https://coding.imooc.com/class/evaluation/393.html?page=5#Log
。URL 的格式如下:
schema://host[:port]/path…/[?query-string]#fragment
-
schema:表示協(xié)議,常見的有 http/https 協(xié)議,還有 ftp 協(xié)議,ws/wss 協(xié)議(websocket)等等;
-
host:域名或者直接是 IP 地址。本例子使用的是慕課網(wǎng)的一個子域名:
coding.imooc.com
; -
port:不寫會使用默認端口,非默認地址一定要寫明端口號。本例中使用默認端口
443
; -
path:資源地址,會有多個
/
表示路徑層級。本例中的路徑為/class/evaluation/393.html
; -
query-string:如果 URL 帶參數(shù),放到
?
之后,#
號之前,使用key=value
形式,多個參數(shù)之間使用&
進行連接。本例中的參數(shù)是?page=5
; -
錨點:或稱片段(fragment),HTTP 請求不包括錨部分,從
#
開始到最后,都是錨部分。本例中的錨部分是 Log。錨部分不是一個 URL 必須的部分。
2. 網(wǎng)站運行原理
在了解上面這些基本術(shù)語后,我們介紹下當在瀏覽器中敲下 www.baidu.com
這個 URL,到百度返回給我們搜索首頁,這個過程中究竟發(fā)生了哪些事情?
-
解析輸入 URL 中包含的信息,比如 HTTP 協(xié)議和域名 (
baidu.com
); -
客戶端先檢查本地是否有對應(yīng)的 IP 地址,若找到則返回響應(yīng)的 IP 地址。若沒找到則請求在 ISP 的 DNS 服務(wù)器上。如果還沒找到,則請求會被發(fā)向根域名服務(wù)器,直到找到對應(yīng)的 IP 地址;
-
瀏覽器在 DNS 服務(wù)器中找到對應(yīng)域名的 IP 地址,然后結(jié)合 URL 中的端口(沒有指明端口則使用默認端口,HTTP 協(xié)議的默認端口是 80,HTTPS 的默認端口是 443) 組成新的請求 URL,并與百度的 Web 服務(wù)建立 TCP 連接;
-
瀏覽器根據(jù)用戶操作向百度的 Web 服務(wù)器發(fā)送 HTTP 請求;
-
Web 服務(wù)器接收到該請求后會根據(jù)請求的路徑查找對應(yīng)的 Web 資源并返回;
-
最后客戶端瀏覽器將這些返回的 Web 信息 (包括圖片、HTML 靜態(tài)頁面,JS 等)組織成用戶可以查看的網(wǎng)頁形式,最后就得到了我們熟悉的那個 百度一下,你就知道 的搜索主頁了。
3. 網(wǎng)站開發(fā)的基本流程
技術(shù)發(fā)展至今,隨著各類 Web 框架的出現(xiàn),一周甚至幾天上線一個網(wǎng)站已經(jīng)不再是夢。但是想要做好一個大型網(wǎng)站,同樣是不容易的。現(xiàn)在來談一下正規(guī)公司的網(wǎng)站,也即 Web 服務(wù)開發(fā)的一個大致流程,基本如下:
-
項目需求分析:產(chǎn)品經(jīng)理在拿到項目之后,需要和架構(gòu)師一起進行需求分析、架構(gòu)的設(shè)計,這一步非常重要,沒有理清需求,后面只會越做越亂;沒有好的架構(gòu)設(shè)計,后續(xù)上線后會面臨各種嚴重問題,比如沒有使用主備數(shù)據(jù)庫模式,可能存在數(shù)據(jù)丟失風(fēng)險等到。此外,一個正規(guī)的網(wǎng)站都需要有自己的域名,一定數(shù)量的服務(wù)主機等到,這些都是事先規(guī)劃好的。當然,也要求網(wǎng)站架構(gòu)能支持后端服務(wù)的水平擴展;
-
規(guī)劃網(wǎng)站頁面并設(shè)計網(wǎng)站草圖:這一步最好有一個美工團隊專門負責。美工出圖,程序員負責實現(xiàn);
-
網(wǎng)站開發(fā)階段:如果架構(gòu)是前后端分離,那么前端和后端服務(wù)可以同時開工,兩不耽誤。往往有了清晰的需求后,代碼實現(xiàn)起來是比較快速的;
-
測試和上線:正常情況下,開發(fā)完成之后會有一個測試團隊對網(wǎng)站各方面功能進行嚴格測試,然后將 bug 單交給開發(fā)團隊返工。開發(fā)團隊修改完后,繼續(xù)由測試團隊進行測試,如此循環(huán)直到問題被掃平,便可以正式部署和上線;
-
最后便是網(wǎng)站的維護和推廣:網(wǎng)站上線后也會遇到很多問題,比如競爭對手的惡意 DDOS 攻擊,網(wǎng)站被人掛馬、釣魚以及用戶訪問量過大后導(dǎo)致服務(wù)癱瘓等等,此時需要運維人員定期檢查網(wǎng)站運行狀態(tài),保證線上環(huán)境的穩(wěn)定運行,同時也需要對網(wǎng)站進行 SEO 和推廣吸引客流。
4. 小結(jié)
今天我們介紹了 Web 編程的相關(guān)術(shù)語,重點介紹了 HTTP 協(xié)議和 URL。接下來,我們介紹了網(wǎng)站的一個運行原理和開發(fā)的基本流程,有了這些知識儲備后,我們就可以正式開始學(xué)習(xí) Django 了。