當使用者在瀏覽器中輸入一個基於HTTP協議的URL時(以http://開頭的URL),就相當於通知瀏覽器按著這個URL組織產生一個HTTP請求,並將這個請求發送到伺服器;同時,等待伺服器的響應。無論是請求還是響應,都統稱為HTTP訊息。
HTTP協議分為兩部分:
1、 HTTP請求訊息。
2、HTTP響應訊息。
一、HTTP請求訊息
HTTP請求訊息分為請求訊息頭以及請求實體內容兩部分。
1、請求訊息頭
(1)請求訊息頭的第一行必須由以下三部分組成:
a.請求的方法(GET、POST和HEAD等)
b.Web資源的路徑(http://www.website.com/test/test.html中的/test/test.html
部分)
c.HTTP協議的版本(HTTP/1.0或HTTP/1.1)
(2)在請求訊息頭的其他行是要求標頭欄位。每一行的格式是:
"頭欄位" ":" "頭欄位的值"
(3)要求標頭以一個空行結束。
如下面是一個GET請求的例子:
GET / HTTP/1.1Host: www.csdn.netConnection: Keep-AliveAccept: */*
如果是POST請求,將要提交的實體內容放到訊息頭的空行後面,如下面是一個POST請求的例子:
POST /servlets-examples/servlet/RequestParamExample HTTP/1.1Host: localhost:8888Content-Length: 29Connection: Closefirstname=Bill&lastname=Gates
在上面的請求訊息中Content-Length表示請求內容的以位元組為單位的長度(" firstname=Bill&lastname=Gates"的長度)。在使用POST方法時,這個欄位必須提供,而且長度必須等於實體內容的長度,否則伺服器將返回一個錯誤狀態代碼。
二、HTTP響應訊息
HTTP響應訊息同樣也分為訊息頭和實體內容兩部分。HTTP的響應訊息頭和請求訊息頭類似;第一行是請求的結果,也就是說,在響應訊息頭的第一行表明了請求訊息是否成功地獲得了伺服器上的Web資源。第一行必須由以下三部分組成:
1、響應訊息的HTTP版本
格式為HTTP/1.1或HTTP/1.0。這個版本號碼未必和請求訊息頭的版本號碼一致;這主要是因為:伺服器未必支援HTTP請求中所描述的HTTP版本,如使用GET / HTTP/1.1去請求伺服器,當伺服器只支援HTTP1.0時,那麼就會返回HTTP/1.0。
2、狀態代碼
這個狀態代碼由三位的數字組成,分為五個檔次。下面是HTTP1.1的響應碼:
(1)以1開頭的數字(1xx)
臨時請求狀態代碼。由100和101組成。這類狀態代碼並不經常使用,它們的作為主要是伺服器為用戶端返回的臨時的狀態。
(2)以2開頭的數字(2xx)
請求成功狀態代碼。範圍從200到206。其中最常用的是200,它表示用戶端請求成功,伺服器已經將所請求的Web資源返回到了用戶端。其他的六個狀態代碼類似,都表示請求成功,只是要指引用戶端進行下一步的動作。如狀態代碼206表示伺服器只是返回了一部分請求資源,用戶端要想獲得全部的Web資源,必須繼續發出HTTP請求。其他的響應碼的含義可以參閱HTTP1.1的規範RFC2616。
(3)以3開頭的數字(3xx)
Web資源重新導向狀態代碼。範圍從300到307。所有以3開頭的狀態代碼都以不同的原因和方式使Web資源改變了原來的URL。如302通過一個Location欄位確定了Web資源改變URL後的位置。有了這種狀態代碼,當某個網站或其他的Web資源的URL變化後,而訪問這些Web資源的使用者並不能即使知道變化後的URL;因此,可以在使用者訪問原來的URL時加一個302響應,使用戶端自動去訪問新的URL。
(4)以4開頭的數字(4xx)
用戶端錯誤狀態代碼。範圍從400到417。也許沒人希望看到這狀態代碼。但它們確實在Internet上大量存在。當使用者訪問的Web資源不存在或是沒有許可權訪問Web資源時,伺服器將返回這類狀態代碼。這類狀態代碼中最常遇到的是400。當使用者發送一個不存在的Web資源路徑時(GET、POST和HEAD方法後面跟的路徑),伺服器就會返回這個狀態代碼。
(5)以5開頭的數字(5xx)
伺服器錯誤狀態代碼。範圍從500到505。這類狀態代碼也是一類錯誤狀態代碼,只是它和4xx不同的是,5xx的錯誤是由於伺服器的原因而產生的;如使用者向伺服器發送一個HTTP協議不支援的方法,如GET1,伺服器將返回501錯誤,表示伺服器不支援這個HTTP要求方法。
3、狀態資訊
響應資訊的內容和狀態代碼息息相關。如狀態代碼為200,則狀態資訊為"OK"。狀態代碼為501,狀態資訊為"Not Implemented"。要想詳細瞭解每一個狀態代碼所對應的狀態資訊,請參閱HTTP1.1的規範RFC2616。
HTTP響應訊息的其他部分和請求訊息一樣,也是由很多回應標頭欄位組成,每個欄位和欄位值佔一行。響應訊息頭使用一個空行結束,空行的後面跟著HTTP響應訊息的實體內容。如下面是一個完整的HTTP請求和響應的例子:
HTTP請求訊息:
GET / HTTP/1.1Host:www.csdn.net
HTTP響應訊息:
HTTP/1.0 200 OKContent-Length: 132273Content-Type: text/htmlContent-Location: http://www.csdn.net/index.htmLast-Modified: Sun, 28 Jan 2007 09:20:00 GMTAccept-Ranges: bytesETag: "eed72b7cbd42c71:1b0e"Server: Microsoft-IIS/6.0X-Powered-By: ASP.NETDate: Sun, 28 Jan 2007 09:23:26 GMTAge: 32X-Cache: HIT from cachebj244.csdn.netConnection: close<!DOCTYPE html
從上面的HTTP訊息可以看出,請求和響應訊息中的HTTP版本並不一樣,這說明CSDN的Web伺服器為了和只支援HTTP1.0的用戶端相容,也採用了HTTP1.0協議。
注意:在HTTP請求和響應訊息中的第一行的要求方法(GET、POST等)以及HTTP/1.1或HTTP1.0中的字母必須大寫,要求方法後面的路徑大小寫都可。訊息頭欄位對大小寫不敏感,但大多數的請求和響應欄位名都採取了首字母大寫的方式。