要很好地領(lǐng)會(huì)Ajax技術(shù)的關(guān)鍵是了解超文本傳輸協(xié)議(HTTP),該協(xié)議用來傳輸網(wǎng)頁、圖像以及因特網(wǎng)上在瀏覽器與服務(wù)器間傳輸?shù)钠渌愋臀募V灰阍跒g覽器上輸入一個(gè)URL,最前面的http://就表示使用HTTP來訪問指定位置的信息。(大部分瀏覽器還支持其他一些不同的協(xié)議,其中FTP就是一個(gè)典型例子。)
注意:本文中只涉及HTTP協(xié)議,這是Ajax開發(fā)人員關(guān)心的方面,它可作為HTTP的參考手冊或指南。
HTTP由兩部分組成:請求和響應(yīng)。當(dāng)你在Web瀏覽器中輸入一個(gè)URL時(shí),瀏覽器將根據(jù)你的要求創(chuàng)建并發(fā)送請求,該請求包含所輸入的URL以及一些與瀏覽器本身相關(guān)的信息。當(dāng)服務(wù)器收到這個(gè)請求時(shí)將返回一個(gè)響應(yīng),該響應(yīng)包括與該請求相關(guān)的信息以及位于指定URL(如果有的話)的數(shù)據(jù)。直到瀏覽器解析該響應(yīng)并顯示出網(wǎng)頁(或其他資源)為止。
HTTP請求
HTTP請求的格式如下所示:
<request-line>
<headers>
<blank line>
[<request-body>]
在HTTP請求中,第一行必須是一個(gè)請求行(request line),用來說明請求類型、要訪問的資源以及使用的HTTP版本。緊接著是一個(gè)首部(header)小節(jié),用來說明服務(wù)器要使用的附加信息。在首部之后是一個(gè)空行,再此之后可以添加任意的其他數(shù)據(jù)[稱之為主體(body)]。
在HTTP中,定義了大量的請求類型,不過Ajax開發(fā)人員關(guān)心的只有GET請求和POST請求。只要在Web瀏覽器上輸入一個(gè)URL,瀏覽器就將基于該URL向服務(wù)器發(fā)送一個(gè)GET請求,以告訴服務(wù)器獲取并返回什么資源。對于www.wrox.com的GET請求如下所示:
GET / 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
Connection: Keep-Alive
請求行的第一部分說明了該請求是GET請求。該行的第二部分是一個(gè)斜杠(/),用來說明請求的是該域名的根目錄。該行的最后一部分說明使用的是HTTP 1.1版本(另一個(gè)可選項(xiàng)是1.0)。那么請求發(fā)到哪里去呢?這就是第二行的內(nèi)容。
第2行是請求的第一個(gè)首部,HOST。首部HOST將指出請求的目的地。結(jié)合HOST和上一行中的斜杠(/),可以通知服務(wù)器請求的是www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原來的1.0版本則不需要使用)。第三行中包含的是首部User-Agent,服務(wù)器端和客戶端腳本都能夠訪問它,它是瀏覽器類型檢測邏輯的重要基礎(chǔ)。該信息由你使用的瀏覽器來定義(在本例中是Firefox 1.0.1),并且在每個(gè)請求中將自動(dòng)發(fā)送。最后一行是首部Connection,通常將瀏覽器操作設(shè)置為Keep-Alive(當(dāng)然也可以設(shè)置為其他值,但這已經(jīng)超出了本書討論的范圍)。注意,在最后一個(gè)首部之后有一個(gè)空行。即使不存在請求主體,這個(gè)空行也是必需的。
如果要獲取一個(gè)諸如http://www.wrox.com/books的www.wrox.com域內(nèi)的頁面,那么該請求可能類似于:
GET /books/ 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
Connection: Keep-Alive
注意只有第一行的內(nèi)容發(fā)生了變化,它只包含URL中www.wrox.com后面的部分。
要發(fā)送GET請求的參數(shù),則必須將這些額外的信息附在URL本身的后面。其格式類似于:
URL ? name1=value1&name2=value2&..&nameN=valueN
該信息稱之為查詢字符串(query string),它將會(huì)復(fù)制在HTTP請求的請求行中,如下所示:
GET /books/?name=Professional%20Ajax 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
Connection: Keep-Alive
注意,為了將文本“Professional Ajax”作為URL的參數(shù),需要編碼處理其內(nèi)容,將空格替換成%20,這稱為URL編碼(URL encoding),常用于HTTP的許多地方(JavaScript提供了內(nèi)建的函數(shù)來處理URL編碼和解碼,這些將在本章中的后續(xù)部分中說明)。“名稱—值”(name—value)對用 & 隔開。絕大部分的服務(wù)器端技術(shù)能夠自動(dòng)對請求主體進(jìn)行解碼,并為這些值的訪問提供一些邏輯方式。當(dāng)然,如何使用這些數(shù)據(jù)還是由服務(wù)器決定的。
瀏覽器發(fā)送的首部,通常比本文中所討論的要多得多。為了簡單起見,這里的例子盡可能簡短。
另一方面,POST請求在請求主體中為服務(wù)器提供了一些附加的信息。通常,當(dāng)填寫一個(gè)在線表單并提交它時(shí),這些填入的數(shù)據(jù)將以POST請求的方式發(fā)送給服務(wù)器。
以下就是一個(gè)典型的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
從上面可以發(fā)現(xiàn), POST請求和GET請求之間有一些區(qū)別。首先,請求行開始處的GET改為了POST,以表示不同的請求類型。你會(huì)發(fā)現(xiàn)首部Host和User-Agent仍然存在,在后面有兩個(gè)新行。其中首部Content-Type說明了請求主體的內(nèi)容是如何編碼的。瀏覽器始終以application/ x-www-form- urlencoded的格式編碼來傳送數(shù)據(jù),這是針對簡單URL編碼的MIME類型。首部Content-Length說明了請求主體的字節(jié)數(shù)。在首部Connection后是一個(gè)空行,再后面就是請求主體。與大多數(shù)瀏覽器的POST請求一樣,這是以簡單的“名稱—值”對的形式給出的,其中name是Professional Ajax,publisher是Wiley。你可以以同樣的格式來組織URL的查詢字符串參數(shù)。
正如前面所提到的,還有其他的HTTP請求類型,它們遵從的基本格式與GET請求和POST請求相同。下一步我們來看看服務(wù)器將對HTTP請求發(fā)送什么響應(yīng)。
HTTP響應(yīng)
如下所示,HTTP響應(yīng)的格式與請求的格式十分類似:
<status-line>
<headers>
<blank line>
[<response-body>]
正如你所見,在響應(yīng)中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請求信息。狀態(tài)行(status line)通過提供一個(gè)狀態(tài)碼來說明所請求的資源情況。以下就是一個(gè)HTTP響應(yīng)的例子:
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>W(wǎng)rox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
在本例中,狀態(tài)行給出的HTTP狀態(tài)代碼是200,以及消息OK。狀態(tài)行始終包含的是狀態(tài)碼和相應(yīng)的簡短消息,以避免混亂。最常用的狀態(tài)碼有:
◆200 (OK): 找到了該資源,并且一切正常。
◆304 (NOT MODIFIED): 該資源在上次請求之后沒有任何修改。這通常用于瀏覽器的緩存機(jī)制。
◆401 (UNAUTHORIZED): 客戶端無權(quán)訪問該資源。這通常會(huì)使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到服務(wù)器。
◆403 (FORBIDDEN): 客戶端未能獲得授權(quán)。這通常是在401之后輸入了不正確的用戶名或密碼。
◆404 (NOT FOUND): 在指定的位置不存在所申請的資源。
在狀態(tài)行之后是一些首部。通常,服務(wù)器會(huì)返回一個(gè)名為Data的首部,用來說明響應(yīng)生成的日期和時(shí)間(服務(wù)器通常還會(huì)返回一些關(guān)于其自身的信息,盡管并非是必需的)。接下來的兩個(gè)首部大家應(yīng)該熟悉,就是與POST請求中一樣的Content-Type和Content-Length。在本例中,首部Content-Type指定了MIME類型HTML(text/html),其編碼類型是ISO-8859-1(這是針對美國英語資源的編碼標(biāo)準(zhǔn))。響應(yīng)主體所包含的就是所請求資源的HTML源文件(盡管還可能包含純文本或其他資源類型的二進(jìn)制數(shù)據(jù))。瀏覽器將把這些數(shù)據(jù)顯示給用戶。
注意,這里并沒有指明針對該響應(yīng)的請求類型,不過這對于服務(wù)器并不重要。客戶端知道每種類型的請求將返回什么類型的數(shù)據(jù),并決定如何使用這些數(shù)據(jù)。
新聞熱點(diǎn)
疑難解答
圖片精選