1、HTTP簡介
WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循HTTP協議。HTTP是TCP/IP協議的一個應用層協議,用於定義WEB服務器之間交換數據的過程及數據本身的格式。常見的HTTP協議版本有HTTP/1.0和HTTP/1.1。
2、HTTP1.0的基本運行方式
- 基於HTTP協議的客戶/服務器模式的信息交換過程,如下圖所示,它一共有四個過程:建立連接、發送請求信息、發送響應信息和關閉連接。
- 瀏覽器和WEB服務器的連接過程是短暫的,每次連接只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接。
- 瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應。
- 無狀態
3、瀏覽器訪問多圖網頁
- 在一個HTML頁面中如果包含
<img>
標記的話,當瀏覽器解析到這些標記的時候,還會向服務器請求訪問標記中指定的文件,即再次建立連接併發出HTTP請求。 - 如果HTML頁面中有一個超級鏈接:
<a href=”http://www.itcast.cn”>itcast</a>
,當點擊這個鏈接時,也會觸發瀏覽器與WEB服務器開始一次新的HTTP通信。
4、HTTP1.1詳解
- HTTP1.1的特點:
- 在一個TCP連接上可以傳送多個HTTP請求和響應
- 多個請求和響應過程可以重疊
- 增加了更多的請求頭和響應頭,比如Host 、if-Unmodified-Since請求頭等
4.1、HTTP請求消息
客戶端連上服務器後,向服務器請求某個web資源,稱爲客戶端向服務器發送了一個HTTP請求。一個完整的HTTP請求包含:一個請求行、若干消息頭、以及請求正文,其中的一些消息頭和正文都是可選的,消息頭和正文內容之間要用空行隔開。
Example:
GET /books/java.html HTTP/1.1 // 請求行,請求行用於描述客戶端的請求方式,請求的資源名稱,以及使用的HTTP協議版本號
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate // 2~8行爲多個消息頭,用於描述客戶端請求那臺主機,以及客戶端的一些環境信息等
// 一個空行
4.2、HTTP響應消息
- 一個HTTP響應代表服務器向客戶端回送的數據
- 一個完整的HTTP響應包括如下內容:一個狀態行、若干消息頭、以及響應正文,其中的一些消息頭和正文是可選的,消息頭和正文內容之間要用空格隔開
- 在一個HTTP響應中,WEB服務器通過響應頭向web客戶端描述客戶端的請求成功與否,以及它所發送的數據類型等一些信息,客戶端通過這些信息,進而可以知道如何對數據進行處理
Example:
HTTP/1.1 200 OK // 狀態行,用於描述服務器對請求的處理結果
Server: Microsoft-IIS/5.0
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Cache-control: private // 2~6行爲多個消息頭,用於描述服務器的基本信息,以及數據的描述,服務器通過這些數據的描述可以通知客戶端如何處理等一會它回送的數據
// 一個空行
<HTML>
<BODY>
…… // 實體內容
4.3、HTTP消息頭(請求和響應的共性)
- 使用消息頭,可以實現HTTP客戶機和服務器之間的條件請求和應答,消息頭相當於服務器和瀏覽器之間的一些暗號指令
- 每個消息頭包含一個頭字段名稱,然後一次是冒號、空格、值、回車和換行符
- example :
Accept-Encoding: gzip, deflate
- example :
- 消息頭字段名是不區分大小寫的,但習慣上講每個單詞的第一個字母大寫
- 整個消息頭部分中的各行消息頭可以按任意順序排列
- 消息頭又可以分爲通用信息頭、請求頭、響應頭、實體頭等四類
- 許多請求頭字段都允許客戶端在值部分指定多個可接受的選項,過個選項之間用逗號分隔
- 有些頭字段可以出現多次,比如,響應消息中可以包含有多個“Warning”頭字段
4.4、HTTP請求行
- 請求行
- 格式: 請求方式 資源路徑 HTTP版本號,example :
GET /temp3o116.shtml HTTP/1.1
- 請求方式:GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT
- 用戶如果沒有設置,默認情況下瀏覽器向服務器發送的都是GET請求,例如在瀏覽器中直接輸入地址訪問,點擊超鏈接訪問等都是GET,用戶如果想把請求方式改爲POST,可以通過更改表單的提交方式實現
- 不管POST或GET,都用於向服務器請求某個WEB資源,這兩種方式的區別主要表現在數據傳遞上
- 格式: 請求方式 資源路徑 HTTP版本號,example :
- GET方式
- 如果請求的方式爲GET方式,則可以在請求的URL地址後以?的形式帶上交給服務器的數據,多個數據之間以&進行分割,example :
GET /mail/1.html?name=abc&password=xyz HTTP/1.1
-GET方式的特點:在URL地址後附帶的參數是有限的,其數據容量通常不能超過1K
- 如果請求的方式爲GET方式,則可以在請求的URL地址後以?的形式帶上交給服務器的數據,多個數據之間以&進行分割,example :
- POST方式
- 如果請求的方式爲POST方式,則可以在請求的正文內容中向服務器發送數據,POST方式的特點是發送的數據量無限制
4.5、HTTP響應的細節 — 狀態行
- 狀態行
- 格式: HTTP版本號 狀態碼 原因敘述
- example :
HTTP/1.1 200 OK
狀態碼用於表示服務器對請求的各種不同處理的結果和狀態,它是一個三位的十進制數。響應碼分爲5類,使用最高位爲1到5來進行分類如下所示:
常用狀態碼
- 200(正常) : 表示一切正常,返回的是正常的請求結果
- 302/307(臨時重定向):指出被請求的文檔已被臨時移動到別處,此文檔的新的URL在Location響應頭中給出
- 304(未修改):表示客戶機緩存的版本是最新的,客戶機可以繼續使用它,無需到服務器請求
- 404(找不到):服務器上不存在客戶機所請求的資源
- 500(服務器內部錯誤):服務器端的程序發生錯誤
4.6、HTTP請求的細節
4.6.1、請求頭1
- 請求頭字段用於客戶端在請求消息中向服務器傳遞附加信息,主要包括客戶端可以接受的數據類型(MIME類型)、壓縮方法、語言以及發出請求的超鏈接所屬頁面的URL地址等信息。
常見的請求頭:
- Accept:瀏覽器可接受的MIME類型
- Accept-Charset: 瀏覽器通過這個頭告訴服務器,它支持哪種字符集
- Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip
- Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。 可以在瀏覽器中進行設置。
- Host:初始URL中的主機和端口
- Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁
- Content-Type:內容類型
4.6.2、請求頭2
If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用這個頭與服務器的文件進行比對,如果一致,則從緩存中直接讀取文件。
- User-Agent:瀏覽器類型.
- Content-Length:表示請求消息正文的長度
- Connection:表示是否需要持久連接。如果服務器看到這裏的值爲“Keep -Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接
- Cookie:這是最重要的請求頭信息之一
- Date:Date: Mon, 22 Aug 2011 01:55:39 GMT請求時間GMT
4.7、HTTP響應的細節
4.7.1、常用響應頭1
- 響應頭字段用於向客戶端傳遞附加信息
- 常用響應頭
- Location: http://www.it315.org/index.jsp指示新的資源的位置
- Server:apache tomcat指示服務器的類型
- Content-Encoding: gzip服務器發送的數據採用的編碼類型
- Content-Length: 80 告訴瀏覽器正文的長度
- Content-Language: zh-cn服務發送的文本的語言
- Content-Type: text/html; charset=GB2312服務器發送的內容的MIME類型
- Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最後修改時間
- Refresh: 1;url=http://www.it315.org指示客戶端刷新頻率。單位是秒
4.7.2、常用響應頭2
- Content-Disposition: attachment; filename=aaa.zip指示客戶端下載文件
- Set-Cookie:SS=Q0=5Lb_nQ; path=/search服務器端發送的Cookie
- Expires: -1
- Cache-Control: no-cache (1.1)
- Pragma: no-cache (1.0)
- Connection: close/Keep-Alive
- Date: Tue, 11 Jul 2000 18:23:51 GMT