- Python高效開發實戰:Django、Tornado、Flask、Twisted(第3版)
- 劉長龍
- 2705字
- 2021-10-15 17:52:49
2.2 HTTP
HTTP,即超文本傳輸協議,是Internet上最主要的Web應用層標準。B/S架構的應用系統用HTTP在客戶端與服務器之間傳送數據。HTTP可以傳送任何格式的數據,從文本到圖像甚至視頻流都可以通過HTTP進行傳輸。本節講解進行網絡開發所必需的HTTP知識。
2.2.1 HTTP流程
HTTP是Web瀏覽器與Web服務器之間通信的標準協議,是Internet上能夠可靠地交換文件的重要基礎。HTTP的基本交互流程如圖2.4所示。

圖2.4 HTTP的基本交互流程
每個HTTP站點都有一個服務器進程監聽著TCP的HTTP端口,HTTP端口默認為80,也可由服務器進程設置為其他端口。當服務器發現有客戶端建立連接并提交了一個HTTP請求(Request)后,就根據請求的內容執行相應的操作,并將結果返回給客戶端(Response)。通常客戶在瀏覽器中發起一次網絡訪問的步驟如下。
(1)輸入網址并按Enter鍵,如訪問http://mysite:8080/app/index.html。
(2)瀏覽器通過域名系統查詢mysite的真實IP,如212.34.98.20。
(3)向服務器212.34.98.20的8080端口發起TCP連接請求并建立連接。
(4)發送HTTP請求的內容,包括訪問的地址/app/index.html、訪問方式GET、瀏覽器本身的產品名等。
(5)服務器返回/app/index.html中的數據作為Response發送給客戶端。如果請求的不是一個文件,則服務器需要執行相應的代碼,動態生成且返回客戶端。
(6)瀏覽器接收到結果后關閉與服務器的TCP連接。
(7)瀏覽器將接收到的結果呈現在顯示器上。
注意:域名解析本身不是HTTP的一部分,客戶端應在向服務器建立TCP連接之前就通過DNS服務器完成域名解析工作。
以上是最典型的HTTP流程,當今的HTTP版本還允許客戶端在一次HTTP請求完成后不關閉TCP連接,以便第2次發送HTTP請求時復用該連接,從而達到減少系統整體開銷的目的,此技術在HTTP中叫作keep-alive。
2.2.2 HTTP消息結構
Python網絡開發者必須通過直接或間接的方式與HTTP打交道。通過學習HTTP消息結構,讓開發人員可以更好地理解Python Web框架中的各種配置及開發選項。
1. Request消息結構
HTTP的兩種消息(Request和Response)采用不同的消息結構,Request消息結構的格式如下:

它由兩部分組成:消息頭(HTTP HEAD)和消息體(HTTP BODY)。消息頭必須遵循上述格式,頭字段可以有若干個;消息體則沒有固定格式;消息頭與消息體之間以一個空行分隔。上述格式中的請求方法、URL、協議版本、頭字段等都屬于消息頭。常用的消息體格式包括HTML、XML、JSON等。典型的Request消息如下:

本例中包括一個用GET方法訪問URL http://www.mysite.com/hello.txt頁面的請求頭,向服務器聲明使用HTTP 1.1,并通過Accept-Language標識了客戶端接收的消息語言。本例的Request中沒有消息體。
2. Response消息結構
Response是服務器根據客戶端的請求包做相應處理后向客戶端返回的結果,Response消息結構的格式如下:

它仍然由兩部分組成,與Request的不同點是第1行由協議版本和錯誤碼組成。典型的Response消息如下:

本例中返回了一個HTTP 1.1的消息,錯誤代碼為200,錯誤字符串為OK。之后的一系列頭字段標識了當前的時間、服務器的應用程序名、消息類型、消息體的長度等。消息體是一個HTML包。
3. 常用頭字段
HTTP頭字段以鍵值對的方式為服務器或客戶端提供對方的信息,如之前用到的Accept-Language、Server等。HTTP中有一些預定義的頭字段經常被用到,開發者需要熟記這些,如表2.2所示。表中的“方向”,如果是Response則指從服務器發送給客戶端,如果是Request則指從客戶端發送給服務器,Both表示兩個方向皆可。
表2.2 常用的HTTP頭字段

續表

續表

4. 常用錯誤代碼
前面已經學習了HTTP,每個Response的第1行中有一個整數狀態碼用于表達其對應Request的結果。HTTP除了約定了該狀態的表達方式,還約定了該狀態的取值范圍,約定的5類狀態碼如下。
? 1xx:信息,表明服務器已經收到Request,但需要進一步處理,請客戶端等待。
? 2xx:成功,處理成功。
? 3xx:重定向,請求的地址已被重定向,需要客戶端重新發起請求。
? 4xx:客戶端錯誤,請求中提交的參數或內容有錯誤。
? 5xx:服務器錯誤,服務器處理請求時出錯,一般本類錯誤需要聯系服務器管理員處理。
注意:1xx~5xx的錯誤為HTTP標準錯誤,在網站開發中如需定義自己的錯誤代碼,則需要避開該范圍。
在上述5類錯誤中,常見的HTTP錯誤代碼如表2.3所示。
表2.3 常見的HTTP錯誤代碼

2.2.3 HTTP請求方法
通過上面的學習,讀者一定想知道HTTP Request包的第1個參數“請求方法”到底有哪些取值,以及為什么要區分它們。HTTP訪問方式的意義在于它能夠告訴服務器客戶端訪問URL的目的是什么,是獲取信息、上傳數據,還是刪除信息等。表2.4總結了HTTP 1.1中常用的訪問方式及其意義。
表2.4 HTTP 1.1中常用的訪問方式及其意義

2.2.4 基于HTTP的網站開發
經過幾十年的發展,已經出現幾個成熟的處理HTTP的知名Web服務器。這些Web服務器可以解析(handle)HTTP,當Web服務器接收到一個HTTP請求時,會根據配置的內容返回一個靜態HTML頁面或者調用某些代碼動態生成返回結果。Web服務器把動態響應(dynamic response)產生的委托(delegate)給其他一些程序,如Python代碼、JSP(Java Server Pages)腳本、Servlets、ASP(Active Server Pages)腳本等。無論它們的目的如何,這些服務器端(server-side)的程序通常會產生一個HTTP響應讓瀏覽器瀏覽。
由于目標操作系統、應用場景及商業目的不同,當今主流的Web服務器各有特色,這里將它們的特性簡單地概括如下。
? Apache:是世界上用得最多的Web服務器,市場占有率在60%左右。由于其卓越的性能,Tomcat或JBoss等很多其他Web服務器使用Apache為自己提供HTTP接口服務。
? Nginx:是一款輕量級、高性能的HTTP和反向代理服務器。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
? IIS:微軟的Web服務器產品。由于Windows的影響,IIS是目前最流行的Web服務器產品之一,它的最大優勢當然是對微軟ASP.NET及其周圍產品的支持。
? Tomcat:是一個開源服務器,是Java Servlet 2.2和Java Server Pages 1.1技術的標準實現。
? JBoss:是一個管理EJB的容器和服務器,支持EJB 1.1、EJB 2.0和EJB 3的規范。但JBoss的核心服務不包括支持Servlet、JSP的Web容器,一般與Tomcat或Jetty綁定使用。
當前的主流Web服務器都實現了主流語言的可調用接口標準,這些標準如下。
? CGI:Common Gateway Interface,CGI規范允許Web服務器執行外部程序,并將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。
? ISAPI:Internet Server Application Program Interface,是微軟提供的一套面向Web服務的API接口,它能實現CGI提供的全部功能,并在此基礎上進行了擴展,例如,提供了過濾器應用程序的接口。
? WSGI:Web Server Gateway Interface,是一套專為Python語言制定的網絡服務器標準接口。本書將要學習的Python Web框架均以WSGI為基礎標準。
從客戶端瀏覽器的角度來看,它的每次訪問是通過HTTP訪問Web服務器從而獲得某種服務(下載文件、查看頁面、訂購商品等)的,但實際上Web服務器僅起到橋梁的作用,即將瀏覽器的HTTP請求解碼,轉換成服務器端程序能夠識別的接口調用方式,然后將服務器端程序生成的返回結果封裝成HTTP Response,并返回給瀏覽器。服務器端程序、Web服務器、客戶端之間的關系如圖2.5所示。

圖2.5 服務器端程序、Web服務器、客戶端之間的關系
最簡單的服務器端程序可以直接讀取某文件或返回固定的網頁內容;稍復雜一些的服務器端程序需要處理客戶端通過HTTP、URL、HTML中傳入的參數、動態執行邏輯代碼、在數據庫或緩存中讀寫數據等一系列操作,才能最終生成調用結果。
- Instant Testing with CasperJS
- PHP程序設計(慕課版)
- Practical DevOps
- oreilly精品圖書:軟件開發者路線圖叢書(共8冊)
- 嚴密系統設計:方法、趨勢與挑戰
- 琢石成器:Windows環境下32位匯編語言程序設計
- Learning Python Design Patterns
- Protocol-Oriented Programming with Swift
- Cocos2d-x Game Development Blueprints
- Django 5企業級Web應用開發實戰(視頻教學版)
- SQL Server 2008中文版項目教程(第3版)
- Java EE Web應用開發基礎
- Flink原理深入與編程實戰:Scala+Java(微課視頻版)
- Mastering Responsive Web Design
- Microsoft Azure Security