1. 程式人生 > Django入門教學 >05 HTTP 協議與網站基本開發流程

05 HTTP 協議與網站基本開發流程

這一節中我們會繼續介紹下 Web 開發中的一些基礎知識,包括常用術語、HTTP 協議、URL 的組成部分,以及網站執行原理和開發的流程。只有理解了這些基礎知識,才能繼續後續的 Django 學習。

1. Web 服務中的常用術語

在正式開始 Django 專案開發之前,我們需要掌握一些 Web 開發中常見的術語。Web 服務和網站在某種程度上是等價的,因此後面描述時並不區分這兩個概念。

  • 客戶端:使用者主機上執行並連線到網際網路的應用程式,一般而言是指瀏覽器。使用者通過瀏覽器實現和網站的資料互動;

  • 服務:服務主要接受和處理來自網際網路的請求。服務一般部署在某臺主機上,監聽某個埠,等待使用者請求;

  • 域名:用於標識一個或者多個 IP 地址;

  • IP:網際網路協議地址。網際網路上的每臺計算機都有一個 IP 地址,用於識別和通訊。IP 地址由4組陣列組成,以小數點分割,這些被稱為邏輯地址;

  • DNS:域名系統服務,主要用於網路域名與 IP 地址的相互轉換;

  • ISP:網際網路服務提供商;

  • TCP/IP:傳輸控制協議/網際協議,是當前網際網路使用的主要通訊協議。

除了上述基礎術語之外,我們還有兩個非常重要的知識點需要掌握,分別是 HTTP 協議和 URL 的組成。

1.1 HTTP 協議

HTTP 協議,即超文字傳輸協議,是一個客戶端終端(使用者)和伺服器端(網站)請求和應答的標準。這也是 Web 開發基礎。因為大部分網站或者 Web 服務的前後端互動幾乎都是走 HTTP 請求。HTTP 協議定義 Web 客戶端如何從 Web 伺服器請求 Web 頁面,以及伺服器如何把 Web 頁面傳送給客戶端。

HTTP 協議採用了請求/響應模型。客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。

HTTP 協議有如下特點:

  • 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。由於 HTTP 協議簡單,使得 HTTP 伺服器的程式規模小,因而通訊速度很快;

  • 靈活:HTTP 允許傳輸任意型別的資料物件;

  • 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間;

  • 無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

1.1.1 HTTP 常見請求

在 HTTP/1.1 協議中共定義了八種方法(也叫“動作”)來以不同方式操作指定的資源,目前我們比較常見和常用的有以下四個:

  • GET 請求:向指定的資源發出“顯示“請求。使用 GET 方法應該只用在讀取資料,而不應當被用於產生“副作用”的操作中。一般在瀏覽器中直接敲擊 URL 並按回車鍵是執行的 GET 請求;

  • POST 請求:向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST 請求可能會導致新的資源的建立和/或已有資源的修改;

  • PUT 請求:從客戶端向伺服器傳送的資料取代指定的文件的內容;

  • DELETE 請求:請求伺服器刪除指定的頁面。

這四種請求和資料的增刪改查(CRUD) 可以看成是相對應的,一般在設計 URL 介面時,也會預設使用這樣特性,讓 GET 請求對應查詢資料、POST 請求對應資料的新增等等,這樣的介面設計出來才會具備良好的 Restful 風格。

1.1.2 HTTP 狀態碼

HTTP 請求通常會返回一個狀態碼,常見的 HTTP 狀態碼有:

  • 2xx:正確類。表示使用者請求被正確接收、理解和處理;

    • 200 - 請求成功;
  • 3xx:重定向類。表示沒有請求成功,必須採取進一步的動作;

    • 301 - 資源(網頁等)被永久轉移到其它 URL;

    • 302 - 資源臨時移動,資源只是臨時被移動,客戶端應繼續使用原有 URI ;

  • 4xx:客戶端錯誤。表示客戶端提交的請求包含語法錯誤或不能正確執行;

    • 400 - 往往是 Bad Request 錯誤。是指請求的方法不對;

    • 401 - 使用者沒有訪問許可權,需要進行身份認證;

    • 403 - 禁止訪問;

    • 404 - 資源不存在,Not Found 錯誤;

  • 5xx:服務端錯誤。一般是說明伺服器出現了問題;

    • 503 - 服務端錯誤,一般是伺服器內部處理異常。

實操: 用 curl命令模擬傳送 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 的中文名稱為統一資源定位符。簡單來說,它就是一個地址,是我們請求網際網路上某一個資源地址或者某一個服務介面的完整路徑。我們找一個網站的實際 URL 例子,來說明下完整 URL 的組成部分:

圖片描述

URL 示例

這個上的完整的 URL 地址為: https://coding.imooc.com/class/evaluation/393.html?page=5#Log。URL 的格式如下:

schema://host[:port]/path…/[?query-string]#fragment
  • schema:表示協議,常見的有 http/https 協議,還有 ftp 協議,ws/wss協議(websocket)等等;

  • host:域名或者直接是 IP 地址。本例子使用的是的一個子域名:coding.imooc.com

  • port:不寫會使用預設埠,非預設地址一定要寫明埠號。本例中使用預設埠 443

  • path:資源地址,會有多個 / 表示路徑層級。本例中的路徑為 /class/evaluation/393.html

  • query-string:如果 URL 帶引數,放到 ? 之後, # 號之前,使用 key=value 形式,多個引數之間使用 & 進行連線。本例中的引數是 ?page=5

  • 錨點:或稱片段(fragment),HTTP 請求不包括錨部分,從 # 開始到最後,都是錨部分。本例中的錨部分是 Log。錨部分不是一個 URL 必須的部分。

2. 網站執行原理

在瞭解上面這些基本術語後,我們介紹下當在瀏覽器中敲下 www.baidu.com 這個 URL,到百度返回給我們搜尋首頁,這個過程中究竟發生了哪些事情?

  • 解析輸入 URL 中包含的資訊,比如 HTTP 協議和域名 (baidu.com);

  • 客戶端先檢查本地是否有對應的 IP 地址,若找到則返回響應的 IP 地址。若沒找到則請求在 ISP 的 DNS 伺服器上。如果還沒找到,則請求會被髮向根域名伺服器,直到找到對應的 IP 地址;

  • 瀏覽器在 DNS 伺服器中找到對應域名的 IP 地址,然後結合 URL 中的埠(沒有指明埠則使用預設埠,HTTP 協議的預設埠是 80,HTTPS 的預設埠是443) 組成新的請求 URL,並與百度的 Web 服務建立 TCP 連線;

  • 瀏覽器根據使用者操作向百度的 Web 伺服器傳送 HTTP 請求;

  • Web 伺服器接收到該請求後會根據請求的路徑查詢對應的 Web 資源並返回;

  • 最後客戶端瀏覽器將這些返回的 Web 資訊 (包括圖片、HTML 靜態頁面,JS 等)組織成使用者可以檢視的網頁形式,最後就得到了我們熟悉的那個 百度一下,你就知道 的搜尋主頁了。

3. 網站開發的基本流程

技術發展至今,隨著各類 Web 框架的出現,一週甚至幾天上線一個網站已經不再是夢。但是想要做好一個大型網站,同樣是不容易的。現在來談一下正規公司的網站,也即 Web 服務開發的一個大致流程,基本如下:

  • 專案需求分析:產品經理在拿到專案之後,需要和架構師一起進行需求分析、架構的設計,這一步非常重要,沒有理清需求,後面只會越做越亂;沒有好的架構設計,後續上線後會面臨各種嚴重問題,比如沒有使用主備資料庫模式,可能存在資料丟失風險等到。此外,一個正規的網站都需要有自己的域名,一定數量的服務主機等到,這些都是事先規劃好的。當然,也要求網站架構能支援後端服務的水平擴充套件;

  • 規劃網站頁面並設計網站草圖:這一步最好有一個美工團隊專門負責。美工出圖,程式設計師負責實現;

  • 網站開發階段:如果架構是前後端分離,那麼前端和後端服務可以同時開工,兩不耽誤。往往有了清晰的需求後,程式碼實現起來是比較快速的;

  • 測試和上線:正常情況下,開發完成之後會有一個測試團隊對網站各方面功能進行嚴格測試,然後將 bug 單交給開發團隊返工。開發團隊修改完後,繼續由測試團隊進行測試,如此迴圈直到問題被掃平,便可以正式部署和上線;

  • 最後便是網站的維護和推廣:網站上線後也會遇到很多問題,比如競爭對手的惡意 DDOS 攻擊,網站被人掛馬、釣魚以及使用者訪問量過大後導致服務癱瘓等等,此時需要運維人員定期檢查網站執行狀態,保證線上環境的穩定執行,同時也需要對網站進行 SEO 和推廣吸引客流。

4. 小結

今天我們介紹了 Web 程式設計的相關術語,重點介紹了 HTTP 協議和 URL。接下來,我們介紹了網站的一個執行原理和開發的基本流程,有了這些知識儲備後,我們就可以正式開始學習 Django 了。