|
一、連接至Web服務(wù)器 一個(gè)客戶端應(yīng)用(如Web瀏覽器)打開到Web服務(wù)器的HTTP端口的一個(gè)套接字(缺省為80)。 例如:http://www.:8080/index.html 在Java中,這將等同于代碼: Soceet socket=new Socket("www.",8080); InputStream in=socket.getInputStream(); OutputStream out=socket.getOutputStream(); 二、發(fā)送HTTP請(qǐng)求 通過連接,客戶端寫一個(gè)ASCII文本請(qǐng)求行,后跟0或多個(gè)HTTP頭標(biāo),一個(gè)空行和實(shí)現(xiàn)請(qǐng)求的任意數(shù)據(jù)。 一個(gè)請(qǐng)求由四個(gè)部分組成:請(qǐng)求行、請(qǐng)求頭標(biāo)、空行和請(qǐng)求數(shù)據(jù) 1.請(qǐng)求行:請(qǐng)求行由三個(gè)標(biāo)記組成:請(qǐng)求方法、請(qǐng)求URI和HTTP版本,它們用空格分隔。 例如:GET /index.html HTTP/1.1 HTTP規(guī)范定義了8種可能的請(qǐng)求方法: GET 檢索URI中標(biāo)識(shí)資源的一個(gè)簡單請(qǐng)求 HEAD 與GET方法相同,服務(wù)器只返回狀態(tài)行和頭標(biāo),并不返回請(qǐng)求文檔 POST 服務(wù)器接受被寫入客戶端輸出流中的數(shù)據(jù)的請(qǐng)求 PUT 服務(wù)器保存請(qǐng)求數(shù)據(jù)作為指定URI新內(nèi)容的請(qǐng)求 DELETE 服務(wù)器刪除URI中命名的資源的請(qǐng)求 OPTIONS 關(guān)于服務(wù)器支持的請(qǐng)求方法信息的請(qǐng)求 TRACE Web服務(wù)器反饋Http請(qǐng)求和其頭標(biāo)的請(qǐng)求 CONNECT 已文檔化但當(dāng)前未實(shí)現(xiàn)的一個(gè)方法,預(yù)留做隧道處理 2.請(qǐng)求頭標(biāo):由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值用冒號(hào)(:)分隔。 請(qǐng)求頭標(biāo)通知服務(wù)器有關(guān)于客戶端的功能和標(biāo)識(shí),典型的請(qǐng)求頭標(biāo)有: User-Agent 客戶端廠家和版本 Accept 客戶端可識(shí)別的內(nèi)容類型列表 Content-Length 附加到請(qǐng)求的數(shù)據(jù)字節(jié)數(shù) 3.空行:最后一個(gè)請(qǐng)求頭標(biāo)之后是一個(gè)空行,發(fā)送回車符和退行,通知服務(wù)器以下不再有頭標(biāo)。 4.請(qǐng)求數(shù)據(jù):使用POST傳送數(shù)據(jù),最常使用的是Content-Type和Content-Length頭標(biāo)。 三、服務(wù)端接受請(qǐng)求并返回HTTP響應(yīng) Web服務(wù)器解析請(qǐng)求,定位指定資源。服務(wù)器將資源副本寫至套接字,在此處由客戶端讀取。 一個(gè)響應(yīng)由四個(gè)部分組成;狀態(tài)行、響應(yīng)頭標(biāo)、空行、響應(yīng)數(shù)據(jù) 1.狀態(tài)行:狀態(tài)行由三個(gè)標(biāo)記組成:HTTP版本、響應(yīng)代碼和響應(yīng)描述。 HTTP版本:向客戶端指明其可理解的最高版本。 響應(yīng)代碼:3位的數(shù)字代碼,指出請(qǐng)求的成功或失敗,如果失敗則指出原因。 響應(yīng)描述:為響應(yīng)代碼的可讀性解釋。 例如:HTTP/1.1 200 OK HTTP響應(yīng)碼: 1xx:信息,請(qǐng)求收到,繼續(xù)處理 2xx:成功,行為被成功地接受、理解和采納 3xx:重定向,為了完成請(qǐng)求,必須進(jìn)一步執(zhí)行的動(dòng)作 4xx:客戶端錯(cuò)誤: 2.響應(yīng)頭標(biāo):像請(qǐng)求頭標(biāo)一樣,它們指出服務(wù)器的功能,標(biāo)識(shí)出響應(yīng)數(shù)據(jù)的細(xì)節(jié)。 3.空行:最后一個(gè)響應(yīng)頭標(biāo)之后是一個(gè)空行,發(fā)送回車符和退行,表明服務(wù)器以下不再有頭標(biāo)。 4.響應(yīng)數(shù)據(jù):HTML文檔和圖像等,也就是HTML本身。 四、服務(wù)器關(guān)閉連接,瀏覽器解析響應(yīng) 1.瀏覽器首先解析狀態(tài)行,查看表明請(qǐng)求是否成功的狀態(tài)代碼。 2.然后解析每一個(gè)響應(yīng)頭標(biāo),頭標(biāo)告知以下為若干字節(jié)的HTML。 3.讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法和語義對(duì)其進(jìn)行格式化,并在瀏覽器窗口中顯示它。 4.一個(gè)HTML文檔可能包含其它需要被載入的資源引用,瀏覽器識(shí)別這些引用,對(duì)其它的資源再進(jìn)行額外的請(qǐng)求,此過程循環(huán)多次。 五、無狀態(tài)連接 HTTP模型是無狀態(tài)的,表明在處理一個(gè)請(qǐng)求時(shí),Web服務(wù)器并不記住來自同一客戶端的請(qǐng)求。 六、實(shí)例 1.瀏覽器發(fā)出請(qǐng)求 GET /index.html HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Content-Length: 119 Content-Type: text/html <HTML> <HEAD> <LINK REL="stylesheet" HREF="index.css"> </HEAD> <BODY> <IMG SRC="image/logo.png"> </BODY> </HTML> 2.瀏覽器發(fā)出請(qǐng)求 GET /index.css HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 70 Content-Type: text/plane h3{ font-size:20px; font-weight:bold; color:#005A9C; } 3.瀏覽器發(fā)出請(qǐng)求 GET image/logo.png HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 1280 Content-Type: text/plane {Binary image data follows} (附錄) 1.HTTP規(guī)范:Internet工程制定組織(IETF)發(fā)布的RFC指定Internet標(biāo)準(zhǔn),這些RFC被Internet研究發(fā)展機(jī)構(gòu)廣泛接受。因?yàn)樗鼈兪菢?biāo)準(zhǔn)文檔,故一般用正規(guī)語言編寫,如立法文標(biāo)一樣。 2.RFC:RFC一旦被提出,就被編號(hào)且不會(huì)再改變,當(dāng)一個(gè)標(biāo)準(zhǔn)被修改時(shí),則給出一個(gè)新的RFC。作為標(biāo)準(zhǔn),RFC在Internet上被廣泛采用。 3.HTTP的幾個(gè)重要RFC: RFC1945 HTTP 1.0 描述 RFC2068 HTTP 1.1 初步描述 RFC2616 HTTP 1.1 標(biāo)準(zhǔn) 4.資源標(biāo)識(shí)符URI(Uniform Resource Identifter,URI) |
|
|