天天看點

Java網絡程式設計從入門到精通(23):HTTP消息頭字段

本文為原創,如需轉載,請注明作者和出處,謝謝!

一、通用頭字段

1. Connection

這個字段隻在HTTP1.1協定中存在。它決定了用戶端和伺服器進行了一次會話後,伺服器是否立即關閉網絡連接配接。在用戶端最直接的表現是使用read方法(readLine方法也是一樣)讀完用戶端請求的Web資源後,是否立即傳回-1(readLine傳回null)。Connection有兩個值:Close和Keep-Alive。當使用Connection:Close時,和HTTP1.0協定是一樣的,當read方法讀完資料時立即傳回;而使用Connection:Keep-Alive時,read方法在讀完資料後還要被阻塞一段時間。直接讀取資料逾時時間過後,還繼續往下執行。在上一篇文章中讨論的readHttpResponse(...)方法實作的第011行可以驗證Connection的作用。下面讓我們來使用HTTP模拟器來做一個實驗。

(1)在HTTP模拟器中輸入如下的域名:

www.baidu.com

(2)HTTP模拟器中輸入如下的HTTP請求資訊:

GET / HTTP/1.1   

Host: www.baidu.com

(3)按兩下回車(輸入一個空行)後,發送請求消息,并得到如圖1如示的HTTP響應消息頭:

圖1

(4)輸入y或Y後(在顯示http響應頭後,要立刻輸入Y或y),顯示響應消息的内容。在顯示完内容後,大約過了10秒鐘才進入"host:port>"提示符(因為在sendHttpRequest()的實作代碼中的004行設定了讀取資料逾時)。

(5)在"host:port>"提示符下直接按回車,輸入最近一次使用的域名www.baidu.com和80端口。再次輸入如下的HTTP請求:

GET / HTTP/1.1    

Connection: close

輸入完以上的HTTP請求後,重新執行第3、4步操作。最後在顯示HTTP響應消息内容後,直接直入了"host:port>"提示符。除了這種方法,将請求的第一行改為GET / HTTP/1.0。這樣也可以無需等待直接結束。

通過設定Connection,可以在下載下傳Web資源(如多線程下載下傳工具、Web浏覽器等)後,立即斷開網絡連接配接,這樣可以有效地降低客戶機的資源消耗。

2. Date

    這個Date頭字段描述了請求消息和響應消息被建立的時間。這個字段值是一個HTTP-date類型,它的格式必須是GMT(格林尼治)時間,GMT時間是就是中原標準時間減8小時。下面是Date字段的一個例子:

Date: Tue, 15 Nov 2007 08:12:31 GMT

3. Content-Length

指定消息實體的位元組數。在請求消息中POST方法必須使用Content-Length來指定請求消息的實體内容的位元組數。在響應消息中這個字段值指定了目前HTTP響應所傳回的Web資源的位元組數。

二、HTTP請求消息頭字段

1. Host

Host字段用于指定用戶端所通路的資源所在的主機名和端口号。如果端口号等于連接配接伺服器時所使用的端口号,則端口号可以省略。下面是一個使用Host字段的一個例子:

Host: www.sina.com.cn

這個字段是必須的,如果HTTP請求不包含這個字段,伺服器将傳回400(Bad

Request)響應狀态。

2. Accept

Accept字段頭确定用戶端可以接收的媒體類型。一般的格式是"*/*"或"類型/"子類型"。這個子段頭可以傳遞多個媒體類型,中間用","隔開。如下面是一個Accept的例子:

Accept::image/gif,image/jpg

如果請求頭使用上述的Accept字段值,則伺服器端在動态生成網頁的IMG頭時将首先包含gif格式的圖像,如果gif圖象不存在,則包含jpg格式的圖象。

3. User-Agent

這個字段頭用于指定用戶端是用什麼通路的伺服器,如果是IE6浏覽器,并且本機安裝了.net 2.0,則User-Agent會有如下的值:

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; InfoPath.2)

伺服器可以通過這個字段檢查客戶機的浏覽器版本,并根據不同的版本來确定向用戶端發送的資料。

4. Range

     Range字段頭通過伺服器隻傳輸一部分Web資源。這個字段頭可以用來實作斷點續傳功能。有很多下載下傳工具就是通過這個字段頭進行斷點續傳的。Range字段可以通過三種格式設定要傳輸的位元組範圍:

(1)Range:

bytes=1000-2000

傳輸範圍從1000到2000位元組。

(2)Range:

bytes=1000-

傳輸Web資源中第1000個位元組以後的所有内容。

(3)Range bytes=1000

傳輸最後1000個位元組。

三、HTTP響應消息頭字段

1. Accept-Ranges

這個字段說明Web伺服器是否支援Range(是否支援斷點續傳功能),如果支援,則傳回Accept-Ranges: bytes,如果不支援,則傳回Accept-Ranges: none。

2. Content-Range

指定了傳回的Web資源的位元組範圍。這個字段值的格式是:

開始位元組位置—結束位元組位置/Web資源的總位元組數

下面是一個使用Content-Range的例子:

Content-Range:1000-3000/5000

測試

在HTTP模拟器中連接配接伺服器files.cnblogs.com,并輸入如下的HTTP請求消息:

GET /nokiaguy/HttpSimulator.rar HTTP/1.1

Host: files.cnblogs.com

Range: bytes=1000-

    傳回的響應消息頭如圖2所示:

圖2

 從上圖可以看出,伺服器files.cnblogs.com支援斷點繼傳功能。而且還可以驗證Content-Length的值是目前會話傳過來的位元組數,并不是Web資源的總的位元組數。而Content-Range字段值中"/"後面的數才是Web資源總的位元組數。

3.  Location

這個字段指定了上哪個新位址獲得新的Web資源。當Web資源更換URL後,而一些老使用者不能及時得知這個新的URL;是以,在老使用者通路原來的URL時,使用Location将這個新的URL傳回給用戶端。這個位址轉換對使用者來說是完全透明。

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>

繼續閱讀