HTTP(HyperText Transfer Protocol)是一套計(jì)算機(jī)通過網(wǎng)絡(luò)進(jìn)行通信的規(guī)則纵刘。計(jì)算機(jī)專家設(shè)計(jì)出HTTP,使HTTP客戶(如Web瀏覽器)能夠從HTTP服務(wù)器(Web服務(wù)器)請(qǐng)求信息和服務(wù)犬第,HTTP目前協(xié)議的版本是1.1.HTTP是一種無狀態(tài)的協(xié)議锦积,無狀態(tài)是指Web瀏覽器和Web服務(wù)器之間不需要建立持久的連接,這意味著當(dāng)一個(gè)客戶端向服務(wù)器端發(fā)出請(qǐng)求歉嗓,然后Web服務(wù)器返回響應(yīng)(response)丰介,連接就被關(guān)閉了,在服務(wù)器端不保留連接的有關(guān)信息.HTTP遵循請(qǐng)求(Request)/應(yīng)答(Response)模型鉴分。Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求哮幢,Web服務(wù)器處理請(qǐng)求并返回適當(dāng)?shù)膽?yīng)答。所有HTTP連接都被構(gòu)造成一套請(qǐng)求和應(yīng)答志珍。
HTTP使用內(nèi)容類型橙垢,是指Web服務(wù)器向Web瀏覽器返回的文件都有與之相關(guān)的類型。所有這些類型在MIME Internet郵件協(xié)議上模型化伦糯,即Web服務(wù)器告訴Web瀏覽器該文件所具有的種類柜某,是HTML文檔、GIF格式圖像舔株、聲音文件還是獨(dú)立的應(yīng)用程序莺琳。大多數(shù)Web瀏覽器都擁有一系列的可配置的輔助應(yīng)用程序,它們告訴瀏覽器應(yīng)該如何處理Web服務(wù)器發(fā)送過來的各種內(nèi)容類型载慈。
HTTP通信機(jī)制是在一次完整的HTTP通信過程中惭等,Web瀏覽器與Web服務(wù)器之間將完成下列7個(gè)步驟:
(1) 建立TCP連接
在HTTP工作開始之前,Web瀏覽器首先要通過網(wǎng)絡(luò)與Web服務(wù)器建立連接办铡,該連接是通過TCP來完成的辞做,該協(xié)議與IP協(xié)議共同構(gòu)建Internet琳要,即著名的TCP/IP協(xié)議族,因此Internet又被稱作是TCP/IP網(wǎng)絡(luò)秤茅。HTTP是比TCP更高層次的應(yīng)用層協(xié)議稚补,根據(jù)規(guī)則,只有低層協(xié)議建立之后才能框喳,才能進(jìn)行更層協(xié)議的連接课幕,因此,首先要建立TCP連接五垮,一般TCP連接的端口號(hào)是80
(2) Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求命令
一旦建立了TCP連接乍惊,Web瀏覽器就會(huì)向Web服務(wù)器發(fā)送請(qǐng)求命令
例如:GET/sample/hello.jsp HTTP/1.1
(3) Web瀏覽器發(fā)送請(qǐng)求頭信息
瀏覽器發(fā)送其請(qǐng)求命令之后,還要以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息放仗,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器润绎,它已經(jīng)結(jié)束了該頭信息的發(fā)送。
(4) Web服務(wù)器應(yīng)答
客戶機(jī)向服務(wù)器發(fā)出請(qǐng)求后诞挨,服務(wù)器會(huì)客戶機(jī)回送應(yīng)答莉撇,
HTTP/1.1 200 OK
應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼
(5) Web服務(wù)器發(fā)送應(yīng)答頭信息
正如客戶端會(huì)隨同請(qǐng)求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會(huì)隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請(qǐng)求的文檔惶傻。
(6) Web服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)
Web服務(wù)器向?yàn)g覽器發(fā)送頭信息后棍郎,它會(huì)發(fā)送一個(gè)空白行來表示頭信息的發(fā)送到此為結(jié)束,接著达罗,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請(qǐng)求的實(shí)際數(shù)據(jù)
(7) Web服務(wù)器關(guān)閉TCP連接
一般情況下坝撑,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請(qǐng)求數(shù)據(jù),它就要關(guān)閉TCP連接粮揉,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發(fā)送后將仍然保持打開狀態(tài)巡李,于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請(qǐng)求扶认。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間侨拦,還節(jié)約了網(wǎng)絡(luò)帶寬。
HTTP請(qǐng)求格式
當(dāng)客戶端向服務(wù)器發(fā)出請(qǐng)求時(shí)辐宾,它向服務(wù)器傳遞了一個(gè)數(shù)據(jù)塊狱从,也就是請(qǐng)求信息,HTTP請(qǐng)求信息由3部分組成:
- 請(qǐng)求方法URI協(xié)議/版本
- 請(qǐng)求方法URI協(xié)議/版本
請(qǐng)求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1
以上代碼中“GET”代表請(qǐng)求方法叠纹,“/sample.jsp”表示URI季研,“HTTP/1.1代表協(xié)議和協(xié)議的版本。
根據(jù)HTTP標(biāo)準(zhǔn)誉察,HTTP請(qǐng)求可以使用多種請(qǐng)求方法与涡。例如:HTTP1.1支持7種請(qǐng)求方法:GET、POST、HEAD驼卖、OPTIONS氨肌、PUT、DELETE和TARCE酌畜。在Internet應(yīng)用中怎囚,最常用的方法是GET和POST。
- 請(qǐng)求頭(Request Header)
- 請(qǐng)求頭包含許多有關(guān)的客戶端環(huán)境和請(qǐng)求正文的有用信息桥胞。例如恳守,請(qǐng)求頭可以聲明瀏覽器所用的語言,請(qǐng)求正文的長(zhǎng)度等埠戳。
Accept:image/gif.image/jpeg./
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
- 請(qǐng)求正文
- 請(qǐng)求頭和請(qǐng)求正文之間是一個(gè)空行井誉,這個(gè)行非常重要,它表示請(qǐng)求頭已經(jīng)結(jié)束整胃,接下來的是請(qǐng)求正文。請(qǐng)求正文中可以包含客戶提交的查詢字符串信息:
username=jinqiao&password=1234
- 下面是一個(gè)HTTP請(qǐng)求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,/
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
HTTP應(yīng)答
- HTTP應(yīng)答與HTTP請(qǐng)求相似喳钟,HTTP響應(yīng)也由3個(gè)部分構(gòu)成屁使,分別是:
- 協(xié)議狀態(tài)版本代碼描述
- 協(xié)議狀態(tài)代碼描述HTTP響應(yīng)的第一行類似于HTTP請(qǐng)求的第一行,它表示通信所用的協(xié)議是HTTP1.1服務(wù)器已經(jīng)成功的處理了客戶端發(fā)出的請(qǐng)求(200表示成功)
- 響應(yīng)頭(Response Header)
- 響應(yīng)頭也和請(qǐng)求頭一樣包含許多有用的信息奔则,例如服務(wù)器類型蛮寂、日期時(shí)間、內(nèi)容類型和長(zhǎng)度等:
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
- 響應(yīng)正文
- 響應(yīng)頭和正文之間也必須用空行分隔易茬。
- HTTP應(yīng)答碼
HTTP應(yīng)答碼也稱為狀態(tài)碼酬蹋,它反映了Web服務(wù)器處理HTTP請(qǐng)求狀態(tài)。HTTP應(yīng)答碼由3位數(shù)字構(gòu)成抽莱,其中首位數(shù)字定義了應(yīng)答碼的類型:
1XX-信息類(Information),表示收到Web瀏覽器請(qǐng)求范抓,正在進(jìn)一步的處理中
2XX-成功類(Successful),表示用戶請(qǐng)求被正確接收,理解和處理例如:200 OK
3XX-重定向類(Redirection),表示請(qǐng)求沒有成功食铐,客戶必須采取進(jìn)一步的動(dòng)作匕垫。
4XX-客戶端錯(cuò)誤(Client Error),表示客戶端提交的請(qǐng)求有錯(cuò)誤 例如:404 NOT
Found虐呻,意味著請(qǐng)求中所引用的文檔不存在象泵。
5XX-服務(wù)器錯(cuò)誤(Server Error)表示服務(wù)器不能完成對(duì)請(qǐng)求的處理:如 500
- 下面是一個(gè)HTTP響應(yīng)的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
安全連接
Web應(yīng)用最常見的用途之一是電子商務(wù),可以利用Web服務(wù)器端程序使人們能夠網(wǎng)絡(luò)購(gòu)物斟叼,需要指出一點(diǎn)是偶惠,缺省情況下,通過Internet發(fā)送信息是不安全的朗涩,如果某人碰巧截獲了你發(fā)給朋友的一則消息忽孽,他就能打開它,假想在里面有你的信用卡號(hào)碼,這會(huì)有多么糟糕扒腕,幸運(yùn)的是绢淀,很多Web服務(wù)器以及Web瀏覽器都有創(chuàng)立安全連接的能力,這樣它們就可以安全的通信了瘾腰。
通過Internet提供安全連接最常見的標(biāo)準(zhǔn)是安全套接層(Secure Sockets layer,SSl)協(xié)議皆的。SSL協(xié)議是一個(gè)應(yīng)用層協(xié)議(和HTTP一樣),用于安全方式在Web上交換數(shù)據(jù)蹋盆,SSL使用公開密鑰編碼系統(tǒng)费薄。從本質(zhì)講,這意味著業(yè)務(wù)中每一方都擁有一個(gè)公開的和一個(gè)私有的密鑰栖雾。當(dāng)一方使用另一方公開密鑰進(jìn)行編碼時(shí)楞抡,只有擁有匹配密鑰的人才能對(duì)其解碼。簡(jiǎn)單來講析藕,公開密鑰編碼提供了一種用于在兩方之間交換數(shù)據(jù)的安全方法召廷,SSL連接建立之后,客戶和服務(wù)器都交換公開密鑰账胧,并在進(jìn)行業(yè)務(wù)聯(lián)系之前進(jìn)行驗(yàn)證竞慢,一旦雙方的密鑰都通過驗(yàn)證,就可以安全地交換數(shù)據(jù)治泥。
GET方法
GET方法是默認(rèn)的HTTP請(qǐng)求方法筹煮,我們?nèi)粘S肎ET方法來提交表單數(shù)據(jù),然而用GET方法提交的表單數(shù)據(jù)只經(jīng)過了簡(jiǎn)單的編碼居夹,同時(shí)它將作為URL的一部分向Web服務(wù)器發(fā)送败潦,因此,如果使用GET方法來提交表單數(shù)據(jù)就存在著安全隱患上准脂。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
從上面的URL請(qǐng)求中劫扒,很容易就可以辯認(rèn)出表單提交的內(nèi)容。(意狠?之后的內(nèi)容)另外由于GET方法提交的數(shù)據(jù)是作為URL請(qǐng)求的一部分所以提交的數(shù)據(jù)量不能太大
POST方法
POST方法是GET方法的一個(gè)替代方法粟关,它主要是向Web服務(wù)器提交表單數(shù)據(jù),尤其是大批量的數(shù)據(jù)环戈。POST方法克服了GET方法的一些缺點(diǎn)闷板。通過POST方法提交表單數(shù)據(jù)時(shí),數(shù)據(jù)不是作為URL請(qǐng)求的一部分而是作為標(biāo)準(zhǔn)數(shù)據(jù)傳送給Web服務(wù)器院塞,這就克服了GET方法中的信息無法保密和數(shù)據(jù)量太小的缺點(diǎn)遮晚。因此,出于安全的考慮以及對(duì)用戶隱私的尊重拦止,通常表單提交時(shí)采用POST方法县遣。
從編程的角度來講糜颠,如果用戶通過GET方法提交數(shù)據(jù),則數(shù)據(jù)存放在QUERY_STRING環(huán)境變量中萧求,而POST方法提交的數(shù)據(jù)則可以從標(biāo)準(zhǔn)輸入流中獲取其兴。
請(qǐng)求方式簡(jiǎn)介
GET通過請(qǐng)求URI得到資源
POST,用于添加新的內(nèi)容
PUT用于修改某個(gè)內(nèi)容
DELETE,刪除某個(gè)內(nèi)容
CONNECT,用于代理進(jìn)行傳輸,如使用SSL
OPTIONS詢問可以執(zhí)行哪些方法
PATCH,部分文檔更改
PROPFIND, (wedav)查看屬性
PROPPATCH, (wedav)設(shè)置屬性
MKCOL, (wedav)創(chuàng)建集合(文件夾)
COPY, (wedav)拷貝
MOVE, (wedav)移動(dòng)
LOCK, (wedav)加鎖
UNLOCK (wedav)解鎖
TRACE用于遠(yuǎn)程診斷服務(wù)器
HEAD類似于GET, 但是不返回body信息夸政,用于檢查對(duì)象是否存在元旬,以及得到對(duì)象的元數(shù)據(jù)