官术网_书友最值得收藏!

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中傳入的參數、動態執行邏輯代碼、在數據庫或緩存中讀寫數據等一系列操作,才能最終生成調用結果。

主站蜘蛛池模板: 怀化市| 太白县| 天等县| 渝北区| 楚雄市| 永定县| 新沂市| 兰坪| 公安县| 晋宁县| 丘北县| 玉屏| 贡觉县| 阿合奇县| 博兴县| 庆云县| 武威市| 恭城| 望江县| 阿拉尔市| 贡嘎县| 东平县| 黔江区| 阳高县| 黄石市| 遵义县| 深圳市| 西乌珠穆沁旗| 临桂县| 衡阳市| 嵊泗县| 邵东县| 于都县| 文昌市| 浦县| 宁波市| 衡水市| 麻江县| 淮安市| 四会市| 北宁市|