GET實(shí)現(xiàn)HTTP協(xié)議請求包的分析
HTTP協(xié)議是我們網(wǎng)絡(luò)中必不可少的重要協(xié)議。那么下面我們就來對這方面的問題進(jìn)行一下深入講解。那么我們就針對GET方法實(shí)現(xiàn)HTTP協(xié)議的具體操作進(jìn)行一下分析。HTTP協(xié)議用于在Internet上發(fā)送和接收消息。HTTP協(xié)議是一種請求-應(yīng)答式的協(xié)議??客戶端發(fā)送一個(gè)請求,服務(wù)器返回該請求的應(yīng)答,所有的請求與應(yīng)答都是HTTP包。HTTP協(xié)議使用可靠的TCP連接,默認(rèn)端口是80。HTTP的第一個(gè)版本是HTTP/0.9,后來發(fā)展到了HTTP/1.0,現(xiàn)在最新的版本是HTTP/1.1。HTTP/1.1由RFC 2616 定義。
在HTTP中,Client/Server之間的會話總是由客戶端通過建立連接和發(fā)送HTTP請求包初始化,服務(wù)器不會主動(dòng)聯(lián)系客戶端或要求與客戶端建立連接。瀏覽器和服務(wù)器都可以隨時(shí)中斷連接,例如,在瀏覽網(wǎng)頁時(shí)你可以隨時(shí)點(diǎn)擊“停止"按鈕中斷當(dāng)前的文件下載過程,關(guān)閉與Web服務(wù)器的HTTP連接。
1 HTTP請求包
HTTP請求包(GET、POST等請求方法)由三個(gè)部分構(gòu)成,分別是:方法-URI-協(xié)議/版本,請求頭,請求正文。下面是一個(gè)HTTP協(xié)議請求包(GET)的例子:
- GET /index.jsp HTTP/1.1
- Accept-Language: zh-cn
- Connection: Keep-Alive
- Host: 192.168.0.106
- Content-Length: 37
- userName=new_andy&password=new_andy
請求包的第一行是方法-URI-協(xié)議/版本:
GET就是請求方法,根據(jù)HTTP標(biāo)準(zhǔn),HTTP協(xié)議請求可以使用多種請求方法。HTTP 1.1支持七種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE等,常用的為請求方法是GET和POST。
/index.jsp表示URI。URI指定了要訪問的網(wǎng)絡(luò)資源。HTTP/1.1是協(xié)議和協(xié)議的版本。
最后一行userName=new_andy&password=new_andy為正文,正文與HTTP頭部有一個(gè)空行(rn)分隔。這里需要說明的一點(diǎn),其中Content-Length說明正文的長度,有的正文長度沒有在頭部說明,只是標(biāo)明Transfer-Encoding: chunked。關(guān)于chunked類型的長度計(jì)算方法,見RFC 1626。
請求包的頭部還會包含許多有關(guān)客戶端環(huán)境和請求正文的有用信息,這里不再描述。
2 HTTP協(xié)議應(yīng)答包
和HTTP請求包相似,由三個(gè)部分構(gòu)成,分別是:協(xié)議-狀態(tài)代碼-描述,應(yīng)答頭,應(yīng)答正文。下面是一個(gè)HTTP應(yīng)答的例子:
- HTTP/1.1 200 OK
- Server: Microsoft-IIS/4.0
- Date: Mon, 3 Jan 2005 13:13:33 GMT
- Content-Type: text/html
- Last-Modified: Mon, 11 Jan 2004 13:23:42 GMT
- Content-Length: 90
- <html>
- <head>
- <title>解讀HTTP包示例</title></head><body>
- Hello WORLD!
- </body>
- </html>
HTTP應(yīng)答包的第一行類似于HTTP協(xié)議請求的第一行,表示所用的協(xié)議是HTTP 1.1,服務(wù)器處理請求的狀態(tài)碼200。
應(yīng)答頭也和請求頭一樣包含許多有用的信息,例如服務(wù)器類型、日期時(shí)間、內(nèi)容類型和長度等。應(yīng)答的正文就是服務(wù)器返回的HTML頁面。應(yīng)答頭和正文之間也用CRLF分隔。