Javaweb之HTTP協議
一、什麼是HTTP協議
HTTP是hypertext transfer protocol(超文字傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB伺服器之間交換資料的過程。客戶端連上web伺服器後,若想獲得web伺服器中的某個web資源,需遵守一定的通訊格式,HTTP協議用於定義客戶端與web伺服器通迅的格式。
二、HTTP協議的版本
HTTP協議的版本:HTTP/1.0、HTTP/1.1,二者的區別為:
在HTTP1.0協議中,客戶端與web伺服器建立連線後,只能獲得一個web資源。
在HTTP1.1協議,允許客戶端與web伺服器建立連線後,在一個連線上獲取多個web資源。
三、HTTP請求
3.1、HTTP請求包括的內容
客戶端連上伺服器後,向伺服器請求某個web資源,稱之為客戶端向伺服器傳送了一個HTTP請求。一個完整的HTTP請求包括如下內容:一個請求行、若干訊息頭、以及實體內容,具體例子如下:
3.2、請求行
如上圖所示,GET為請求行的請求方式,請求方式有POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有POST和GET。在預設情況下,瀏覽器向伺服器傳送的是GET請求。
GET方式的特點:在URL地址後附帶的引數是有限制的,其資料容量通常不能超過1K。
如果請求方式為POST方式,則可以在請求的實體內容中向伺服器傳送資料,Post方式的特點:傳送的資料量無限制。
3.3、訊息頭
HTTP請求中的常用訊息頭
accept:瀏覽器通過這個頭告訴伺服器,它所支援的資料型別
Accept-Charset: 瀏覽器通過這個頭告訴伺服器,它支援哪種字符集
Accept-Encoding:瀏覽器通過這個頭告訴伺服器,支援的壓縮格式
Accept-Language:瀏覽器通過這個頭告訴伺服器,它的語言環境
Host:瀏覽器通過這個頭告訴伺服器,想訪問哪臺主機
If-Modified-Since: 瀏覽器通過這個頭告訴伺服器,快取資料的時間
Referer:瀏覽器通過這個頭告訴伺服器,客戶機是哪個頁面來的 防盜鏈
Connection:瀏覽器通過這個頭告訴伺服器,請求完後是斷開連結還是何持連結
四、HTTP相應
如圖為一個HTTP響應
5.1、狀態行
狀態行格式: HTTP版本號 狀態碼 原因敘述
狀態碼用於表示伺服器對請求的處理結果,它是一個三位的十進位制數。響應狀態碼分為5類,如下所示:
5.2、常用響應頭
HTTP響應中的常用響應頭(訊息頭)
Location: 伺服器通過這個頭,來告訴瀏覽器跳到哪裡
Server:伺服器通過這個頭,告訴瀏覽器伺服器的型號
Content-Encoding:伺服器通過這個頭,告訴瀏覽器,資料的壓縮格式
Content-Length: 伺服器通過這個頭,告訴瀏覽器回送資料的長度
Content-Language: 伺服器通過這個頭,告訴瀏覽器語言環境
Content-Type:伺服器通過這個頭,告訴瀏覽器回送資料的型別
Refresh:伺服器通過這個頭,告訴瀏覽器定時重新整理
Content-Disposition: 伺服器通過這個頭,告訴瀏覽器以下載方式打資料
Transfer-Encoding:伺服器通過這個頭,告訴瀏覽器資料是以分塊方式回送的
Expires: -1 控制瀏覽器不要快取
Cache-Control: no-cache
Pragma: no-cache
五、HTTP工作原理
HTTP協議定義Web客戶端如何從Web伺服器請求Web頁面,以及伺服器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。
以下是 HTTP 請求/響應的步驟:
1、客戶端連線到Web伺服器
一個HTTP客戶端,通常是瀏覽器,與Web伺服器的HTTP埠(預設為80)建立一個TCP套接字連線。例如,
http://www.oakcms.cn
。2、傳送HTTP請求
通過TCP套接字,客戶端向Web伺服器傳送一個文字的請求報文,一個請求報文由請求行、請求頭部、空行和請求資料4部分組成。
3、伺服器接受請求並返回HTTP響應
Web伺服器解析請求,定位請求資源。伺服器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應資料4部分組成。
4、釋放連線TCP連線
若connection 模式為close,則伺服器主動關閉TCP連線,客戶端被動關閉連線,釋放TCP連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求;
5、客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態程式碼。然後解析每一個響應頭,響應頭告知以下為若干位元組的HTML文件和文件的字符集。客戶端瀏覽器讀取響應資料HTML,根據HTML的語法對其進行格式化,並在瀏覽器視窗中顯示。
例如:在瀏覽器位址列鍵入URL,按下回車之後會經歷以下流程:
1、瀏覽器向 DNS 伺服器請求解析該 URL 中的域名所對應的 IP 地址;
2、解析出 IP 地址後,根據該 IP 地址和預設埠 80,和伺服器建立TCP連線;
3、瀏覽器發出讀取檔案(URL 中域名後面部分對應的檔案)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的資料傳送給伺服器;
4、伺服器對瀏覽器請求作出響應,並把對應的 html 文字傳送給瀏覽器;
5、釋放 TCP連線;
6、瀏覽器將該 html 文字並顯示內容。
六、URL、URI
HTTP使用統一資源識別符號(Uniform Resource Identifiers, URI)來傳輸資料和建立連線。URL是一種特殊型別的URI,包含了用於查詢某個資源的足夠的資訊
URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是網際網路上用來標識某一處資源的地址。以下面這個URL為例,介紹下普通URL的各部分組成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1.協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的“//”為分隔符
2.域名部分:該URL的域名部分為“www.aspxfans.com”
。一個URL中,也可以使用IP地址作為域名使用
3.埠部分:跟在域名後面的是埠,域名和埠之間使用“:”作為分隔符。埠不是一個URL必須的部分,如果省略埠部分,將採用預設埠
4.虛擬目錄部分:從域名後的第一個“/”開始到最後一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”
5.檔名部分:從域名後的最後一個“/”開始到“?”為止,是檔名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”為止,是檔案部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是檔名部分。本例中的檔名是“index.asp”。檔名部分也不是一個URL必須的部分,如果省略該部分,則使用預設的檔名
6.錨部分:從“#”開始到最後,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分
7.引數部分:從“?”開始到“#”為止之間的部分為引數部分,又稱搜尋部分、查詢部分。本例中的引數部分為“boardID=5&ID=24618&page=1”。引數可以允許有多個引數,引數與引數之間用“&”作為分隔符。
URL與URI的區別
URI,是uniform resource identifier,統一資源識別符號,用來唯一的標識一個資源。
Web上可用的每種資源如HTML文件、影象、視訊片段、程式等都是一個來URI來定位的
URI一般由三部組成:
①訪問資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,著重強調於資源。
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明瞭如何locate這個資源。
URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和伺服器程式上,特別是著名的Mosaic。
採用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的地址和目錄等。URL一般由三部組成:
①協議(或稱為服務方式)
②存有該資源的主機IP地址(有時也包括埠號)
③主機資源的具體地址。如目錄和檔名等
URN,uniform resource name,統一資源命名,是通過名字來標識資源,比如mailto:[email protected]。
URI是以一種抽象的,高層次概念定義統一資源標識,而URL和URN則是具體的資源標識的方式。URL和URN都是一種URI。籠統地說,每個 URL 都是 URI,但不一定每個 URI 都是 URL。這是因為 URI 還包括一個子類,即統一資源名稱 (URN),它命名資源但不指定如何定位資源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
在Java的URI中,一個URI例項可以代表絕對的,也可以是相對的,只要它符合URI的語法規則。而URL類則不僅符合語義,還包含了定位該資源的資訊,因此它不能是相對的。
在Java類庫中,URI類不包含任何訪問資源的方法,它唯一的作用就是解析。
相反的是,URL類可以開啟一個到達資源的流。