1. 程式人生 > >HTTP 伺服器開發(Java)--HTTP請求

HTTP 伺服器開發(Java)--HTTP請求

最近由於要課程作業,要做一個HTTP伺服器,現在紀錄下我做這個課程作業的全部過程。

(一)理論知識    

       HTTP(HyperText Transfer Protocol)是一套計算機通過網路進行通訊的規則。計算機專家設計出HTTP,使HTTP客戶(如Web瀏覽器)能夠從HTTP伺服器(Web伺服器)請求資訊和服務,HTTP目前協議的版本是1.1.HTTP是一種無狀態的協議,無狀態是指Web瀏覽器和Web伺服器之間不需要建立持久的連線,這意味著當一個客戶端向伺服器端發出請求,然後Web伺服器返回響應(response),連線就被關閉了,在伺服器端不保留連線的有關資訊.HTTP遵循請求(Request)/應答(Response)模型。Web瀏覽器向Web伺服器傳送請求,Web伺服器處理請求並返回適當的應答。所有HTTP連線都被構造成一套請求和應答。

       HTTP 使用內容型別,是指Web伺服器向Web瀏覽器返回的檔案都有與之相關的型別。所有這些型別在MIME Internet郵件協議上模型化,即Web服務 器告訴Web瀏覽器該檔案所具有的種類,是HTML文件、GIF格式影象、聲音檔案還是獨立的應用程式。大多數Web瀏覽器都擁有一系列的可配置的輔助應 用程式,它們告訴瀏覽器應該如何處理Web伺服器傳送過來的各種內容型別。
       HTTP通訊機制是在一次完整的HTTP通訊過程中,Web瀏覽器與Web伺服器之間將完成下列7個步驟:
(1) 建立TCP連線
在HTTP 工作開始之前,Web瀏覽器首先要通過網路與Web伺服器建立連線,該連線是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的 TCP/IP協議族,因此Internet又被稱作是TCP/IP網路。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能, 才能進行更層協議的連線,因此,首先要建立TCP連線,一般TCP連線的埠號是80
(2) Web瀏覽器向Web伺服器傳送請求命令
一旦建立了TCP連線,Web瀏覽器就會向Web伺服器傳送請求命令
例如:GET /sample/hello.jsp  HTTP/1.1
(3) Web瀏覽器傳送請求頭資訊
瀏覽器傳送其請求命令之後,還要以頭資訊的形式向Web伺服器傳送一些別的資訊,之後瀏覽器傳送了一空白行來通知伺服器,它已經結束了該頭資訊的傳送。
(4) Web伺服器應答
客戶機向伺服器發出請求後,伺服器會客戶機回送應答,
HTTP/1.1 200 OK
應答的第一部分是協議的版本號和應答狀態碼
(5) Web伺服器傳送應答頭資訊
正如客戶端會隨同請求傳送關於自身的資訊一樣,伺服器也會隨同應答向用戶傳送關於它自己的資料及被請求的文件。
(6) Web伺服器向瀏覽器傳送資料
Web伺服器向瀏覽器傳送頭資訊後,它會發送一個空白行來表示頭資訊的傳送到此為結束,接著,它就以Content-Type應答頭資訊所描述的格式傳送使用者所請求的實際資料
(7) Web伺服器關閉TCP連線
一般情況下,一旦Web伺服器向瀏覽器傳送了請求資料,它就要關閉TCP連線,然後如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼
Connection:keep-alive
TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。
    
HTTP請求格式
當瀏覽器向Web伺服器發出請求時,它向伺服器傳遞了一個數據塊,也就是請求資訊,HTTP請求資訊由3部分組成:
1. 請求方法URI協議/版本
2. 請求頭(Request Header)

3.請求正文

 HTTP請求報文格式:

  GET /web/test HTTP/1.1

  Host: 127.0.0.1:8888

  Connection: keep-alive

  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/*/;q=0.8

  User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36

  Accept-Encoding: gzip, deflate, sdch

  Accept-Language: zh-CN,zh;q=0.8

  q是權重係數,範圍 0 =< q <= 1,q 值越大,請求越傾向於獲得其“;”之前的型別表示的內容,

  若沒有指定 q 值,則預設為1,若被賦值為0,則用於提醒伺服器哪些是瀏覽器不接受的內容型別

      請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字串資訊:
      username=jinqiao&password=1234
      在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。
HTTP請求方法我這裡只討論GET方法與POST方法
     (1)GET方法
      GET方法是預設的HTTP請求方法,我們日常用GET方法來提交表單資料,然而用GET方法提交的表單資料只經過了簡單的編碼,同時它將作為URL的一部分向Web伺服器傳送,因此,如果使用GET方法來提交表單資料就存在著安全隱患上。例如
Http://127.0.0.1 :8888/index.html?Name=lip
從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的資料是作為URL請求的一部分所以提交的資料量不能太大
     (2)POST方法
      POST 方法是GET方法的一個替代方法,它主要是向Web伺服器提交表單資料,尤其是大批量的資料。POST方法克服了GET方法的一些缺點。通過POST方法 提交表單資料時,資料不是作為URL請求的一部分而是作為標準資料傳送給Web伺服器,這就克服了GET方法中的資訊無法保密和資料量太小的缺點。因此, 出於安全的考慮以及對使用者隱私的尊重,通常表單提交時採用POST方法。

HTTP應答與HTTP請求相似,HTTP響應也由3個部分構成,分別是:
(1)協議狀態版本程式碼描述
(2)響應頭(Response Header)
(3)響應正文
下面是一個HTTP響應的例子:

HTTP/1.1 200 OK

Connection:keep-alive

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:23:42 GMT

Last-Modified:Mon,6Oct2003 13:23:42 GMT

Content-Length:112

Content-Type:text/html

<html>

<head>

<title>HTTP響應示例<title>

</head>

<body>

Hello HTTP!

</body>

</html>

     協議狀態程式碼描述HTTP響應的第一行類似於HTTP請求的第一行,它表示通訊所用的協議是HTTP1.1伺服器已經成功的處理了客戶端發出的請求(200表示成功):
          HTTP/1.1 200 OK
   響應頭(Response Header)響應頭也和請求頭一樣包含許多有用的資訊,例如伺服器型別、日期時間、內容型別和長度等。

HTTP應答碼
   HTTP應答碼也稱為狀態碼,它反映了Web伺服器處理HTTP請求狀態。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的型別:

   1XX-資訊類(Information),表示收到Web瀏覽器請求,正在進一步的處理中

   2XX-成功類(Successful),表示使用者請求被正確接收,理解和處理例如:200 OK

          3XX-重定向類(Redirection),表示請求沒有成功,客戶必須採取進一步的動作。

   4XX-客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOTFound,意味著請求中所引用的文件不存在。

5XX-伺服器錯誤(Server Error)表示伺服器不能完成對請求的處理:如 500