1. 程式人生 > >【Java8網路程式設計】第3章. HTTP和URLConnection類

【Java8網路程式設計】第3章. HTTP和URLConnection類

1.HTTP基本概念

HTTP(HyperText Transport Protocol)是超文字傳輸協議的縮寫,它用於傳送WWW方式的資料。HTTP協議採用了請求/響應模型。客戶端向伺服器傳送一個請求,請求頭包含請求的方法、URL、協議版本、以及包含請求修飾符、客戶資訊和內容的類似於MIME的訊息結構。伺服器以一個狀態行作為響應,響應的內容包括訊息協議的版本,成功或者錯誤編碼加上包含伺服器資訊、實體元資訊以及可能的實體內容。

HTTP請求

HTTP請求的格式如下所示:

<request-line>
<headers>
<blank line[<request-body>]

在HTTP 請求中,第一行必須是一個請求行(request line),用來說明請求型別、要訪問的資源以及使用的HTTP版本。緊接著是一個首部(header)小節,用來說明伺服器要使用的附加資訊。在首部之後是一個空行,再此之後可以新增任意的其他資料[稱之為主體(body)]。
在HTTP中,定義了大量的請求型別GET,POST,DELETE,PUT。
GET


只要在Web瀏覽器上輸入一個URL,瀏覽器就將基於該URL向伺服器傳送一個GET請求,以告訴伺服器獲取並返回什麼資源。對於 一個普通的GET請求如下所示:

GET / HTTP/1.1
Host: www.xyz.com
User-Agent: Mozilla/5.0 Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

請求行的第一部分說明了該請求是GET請求。該行的第二部分是一個斜槓(/),用來說明請求的是該域名的根目錄。該行的最後一部分說明使用的是HTTP 1.1版本(另一個可選項是1.0)。那麼請求發到哪裡去呢?這就是第二行的內容。

第2 行是請求的第一個首部,HOST。首部HOST將指出請求的目的地。結合HOST和上一行中的斜槓(/),可以通知伺服器請求的是 www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原來的1.0版本則不需要使用)。第三行中包含的是首部User-Agent,伺服器端和客戶端指令碼都能夠訪問它,它是瀏覽器型別檢測邏輯的重要基礎。該資訊由你使用的瀏覽器來定義(在本例中是Firefox 1.0.1),並且在每個請求中將自動傳送。最後一行是首部Connection,通常將瀏覽器操作設定為Keep-Alive(當然也可以設定為其他值,但這已經超出了本書討論的範圍)。注意,在最後一個首部之後有一個空行。即使不存在請求主體,這個空行也是必需的。
瀏覽器傳送的首部,通常比本文中所討論的要多得多。為了簡單起見,這裡的例子儘可能簡短。

post
另一方面,POST請求在請求主體中為伺服器提供了一些附加的資訊。通常,當填寫一個線上表單並提交它時,這些填入的資料將以POST請求的方式傳送給伺服器。

以下就是一個典型的POST請求:

POST / HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows;
U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

從上面可以發現, POST請求和GET請求之間有一些區別。首先,請求行開始處的GET改為了POST,以表示不同的請求型別。你會發現首部Host和User- Agent仍然存在,在後面有兩個新行。其中首部Content-Type說明了請求主體的內容是如何編碼的。瀏覽器始終以application/ x-www-form- urlencoded的格式編碼來傳送資料,這是針對簡單URL編碼的MIME型別。首部Content-Length說明了請求主體的位元組數。在首部 Connection後是一個空行,再後面就是請求主體。與大多數瀏覽器的POST請求一樣,這是以簡單的“名稱—值”對的形式給出的,其中name是 Professional Ajax,publisher是Wiley。你可以以同樣的格式來組織URL的查詢字串引數。

HTTP響應

正如前面所提到的,還有其他的HTTP請求型別,它們遵從的基本格式與GET請求和POST請求相同。下一步我們來看看伺服器將對HTTP請求傳送什麼響應。
如下所示,HTTP響應的格式與請求的格式十分類似:

<status-line>
<headers>
<blank line[<response-body>]

正如你所見,在響應中唯一真正的區別在於第一行中用狀態資訊代替了請求資訊。狀態行(status line)通過提供一個狀態碼來說明所請求的資源情況。以下就是一個HTTP響應的例子:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!– body goes here –>
</body>
</html>

在本例中,狀態行給出的HTTP狀態程式碼是200,以及訊息OK。狀態行始終包含的是狀態碼和相應的簡短訊息,以避免混亂。最常用的狀態碼有:

◆200 (OK): 找到了該資源,並且一切正常。
◆304 (NOT MODIFIED): 該資源在上次請求之後沒有任何修改。這通常用於瀏覽器的快取機制。
◆401 (UNAUTHORIZED): 客戶端無權訪問該資源。這通常會使得瀏覽器要求使用者輸入使用者名稱和密碼,以登入到伺服器。
◆403 (FORBIDDEN): 客戶端未能獲得授權。這通常是在401之後輸入了不正確的使用者名稱或密碼。
◆404 (NOT FOUND): 在指定的位置不存在所申請的資源。

在狀態行之後是一些首部。通常,伺服器會返回一個名為Data的首部,用來說明響應生成的日期和時間(伺服器通常還會返回一些關於其自身的資訊,儘管並非是必需的)。接下來的兩個首部大家應該熟悉,就是與POST請求中一樣的Content-Type和Content-Length。在本例中,首部 Content-Type指定了MIME型別HTML(text/html),其編碼型別是ISO-8859-1(這是針對美國英語資源的編碼標準)。響應主體所包含的就是所請求資源的HTML原始檔(儘管還可能包含純文字或其他資源型別的二進位制資料)。瀏覽器將把這些資料顯示給使用者。

注意,這裡並沒有指明針對該響應的請求型別,不過這對於伺服器並不重要。客戶端知道每種型別的請求將返回什麼型別的資料,並決定如何使用這些資料。

2.URLConnection類