Http協議由Tim Berners-Lee(被稱為Web之父)發明。Http協議是完全基於文本的。浏覽器通過http協議和服務器交互,默認是80端口。也可以顯式的在URL中指出端口號。比如:http://localhost:8080/index.html。Http協議是一種無狀態協議,並且不適合實時的獲取數據的應用,因為過多實時的客戶端和服務端的交互將會導致網絡的頻繁通信並受到帶寬的限制。Http協議也不能告訴服務器客戶的請求是如何產生的。這使得B/S比C/S實現上難度較大。
浏覽器主要有兩種命令和服務器交互,一種叫Get,另一種叫Post。邏輯上看,Get命令相當於讀操作,向服務器發出請求,然後獲取數據,Post命令向服務器發出執行某個動作的指令,有可能會修改服務器上的某些數據,因此是不可逆的操作。我們要防止用戶不斷的快速刷新頁面引發的Post命令,通常一個提示對話框讓用戶確認操作是否真的有必要進行是一種常用的方法。
Get命令的格式:請求行,請求首部,請求主體(可選)。
GET /index.html HTTP/1.0
Host: www.gefionsoftware.com
User-Agent: Mozilla/4.5 [en] (WinNT;I)
Accept: image/gif, image/jpeg, image/pjpeg, image/ping,*/*
Accept-Language : en
Accept-Charset : iso-8859-1,*,utf-8
上面的例子裡面,第一行是請求行,表明是GET命令,請求的資源是index.html ,協議是HTTP1.0。後面所有的都是請求首部,沒有請求主體。
服務器的應答格式:狀態行,應答首部,應答主體(可選)。
HTTP/1.0 200 OK
Last-Modified: Mon, 20 Dec 2001:23:26:42 GMT
Date: Tue, 11 Jan 2002 20:52:40 GMT
Status:200
Content-Type: text/html
Servlet-Engine: Tomcat Web Server/4.0.1
Content-Length: 59
<html>
<body>
<h1>Hello,world!</h1>
</body>
</html>
第一行是狀態行,協議+狀態值+狀態描述。然後是應答首部,最後一段html代碼是應答主體。我們經常能看到狀態值為401的回應,代表未被授權。
如果應答主體比較復雜,裡面包含了圖片或者其他資源的鏈接。客戶端會自動再發出一個Get命令獲取相關資源。通常這些動作是並行的,不過每個浏覽器的行為不一樣:IE似乎表現成串行,而Firefox會先將第一個應答主體的內容顯示出來,在逐個顯示內嵌圖片的應答主體。
Get命令還可加上請求參數。請求參數可以接著url後面,比如:
http://localhost:8080/index.html?a=2&b=7 ?開始,&間隔每個參數名稱和值對。這種方式稱為查詢字符串。由於使用了?,=,&來作為分隔符,所以其他的字符在發送時都采用了URL編碼方式,以避免混淆。歡迎光臨學網,收藏本篇文章 [1] [2]
$False$
也可以將請求參數(格式相同)作為請求主體的一部分發送,不過這通常是Post命令的做法。
Post命令格式:
POST forecast HTTP/1.0
Host: www.gefionsoftware.com
User-Agent:Mozilla/4.5 [en] (WinNT; I)
Accept: image/gif, image/jpeg, image/pjpeg,image/png, */*
Accept-language: en
Accept-charset: iso-88569-1,*,utf-8
city=Hermosa+Beach&state=CA
Post行中的 forecast是action的名稱,後面是協議名。注意最後一行的查詢字符串,沒有?開頭,並且是嵌入在Post主體中的。通常Post由form表單觸發。比如上面的命令對應的form表單為:
<form action: “/forecast” method=”POST”>
City: <input name=”city” type=”text”>
State: <input name=”state” type=”text>
<p>
<input type=”SUBMIT”>
</form>
注意,這裡第一行加了屬性method=”POST”,如果不加的話,默認為GET。
HTTP協議的其它方法還有OPTIONS,HEAD,PUT,DELETE,TRACE等五個。但是這些方法使用的很少。