)ajaxxmlhttp:瞭解Ajax中使用的比較少見的HTTP 要求

來源:互聯網
上載者:User

對於很多 Web 開發人員來說,只需要產生簡單的請求並接收簡單的響應即可;但是對於希望掌握 Ajax 的開發人員來說,必須要全面理解 HTTP 狀態碼、就緒狀態和 XMLHttpRequest 對象。在本文中,Brett McLaughlin 將向您介紹各種狀態碼,並展示瀏覽器如何對其進行處理,本文還給出了在 Ajax 中使用的比較少見的 HTTP 要求。

在本系列的 上篇文章 中,我們將詳細介紹 XMLHttpRequest 對象,它是 Ajax 應用程式的中心,負責處理伺服器端應用程式和指令碼的請求,並處理從伺服器端組件返回的資料。由於所有的 Ajax 應用程式都要使用 XMLHttpRequest 對象,因此您可能會希望熟悉這個對象,從而能夠讓 Ajax 執行得更好。

在本文中,我將在上一篇文章的基礎上重點介紹這個請求對象的 3 個關鍵區段的內容:

·HTTP 就緒狀態
·HTTP 狀態碼
·可以產生的請求類型

這三部分內容都是在構造一個請求時所要考慮的因素;但是介紹這些主題的內容太少了。然而,如果您不僅僅是想瞭解 Ajax 編程的常識,而是希望瞭解更多內容,就需要熟悉就緒狀態、狀態碼和請求本身的內容。當應用程式出現問題時 —— 這種問題總是存在 —— 那麼如果能夠正確理解就緒狀態、如何產生一個 HEAD 請求或者 400 的狀態碼的確切含義,就可以在 5 分鐘內調試出問題,而不是在各種挫折和困惑中度過 5 個小時。

下面讓我們首先來看一下 HTTP 就緒狀態。

深入瞭解 HTTP 就緒狀態

您應該還記得在上一篇文章中 XMLHttpRequest 對象有一個名為 readyState 的屬性。這個屬性確保伺服器已經完成了一個請求,通常會使用一個回呼函數從伺服器中讀出資料來更新 Web 表單或頁面的內容。清單 1 給出了一個簡單的例子(這也是本系列的上一篇文章中的一個例子 —— 請參見 參考資料)。

XMLHttpRequest 或 XMLHttp:換名玫瑰

Microsoft 和 Internet Explorer 使用了一個名為 XMLHttp 的對象,而不是 XMLHttpRequest 對象,而 Mozilla、Opera、Safari 和 大部分非 Microsoft 瀏覽器都使用的是後者。為了簡單性起見,我將這兩個對象都簡單地稱為 XMLHttpRequest。這既符合我們在 Web 上看到的情況,又符合 Microsoft 在 Internet Explorer 7.0 中使用 XMLHttpRequest 作為請求對象的意圖。(有關這個問題的更多內容,請參見 第 2 部分。)

清單 1. 在回呼函數中處理伺服器的響應

function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseText.split(\"|\");
document.getElementById(\"order\").value = response[0];
document.getElementById(\"address\").innerHTML =
response[1].replace(/\\n/g, \"<br />\");
} else
alert(\"status is \" + request.status);
}
}

[Page]

這顯然是就緒狀態最常見(也是最簡單)的用法。正如您從數字 \"4\" 中可以看出的一樣,還有其他幾個就緒狀態(您在上一篇文章中也看到過這個清單 —— 請參見 參考資料):

·0:請求未初始化(還沒有調用 open())。
·1:請求已經建立,但是還沒有發送(還沒有調用 send())。
·2:請求已發送,正在處理中(通常現在可以從響應中擷取內容標題)。
·3:請求在處理中;通常響應中已有部分資料可用了,但是伺服器還沒有完成響應的產生。
·4:響應已完成;您可以擷取並使用伺服器的響應了。

如果您希望不僅僅是瞭解 Ajax 編程的基本知識,那麼就不但需要知道這些狀態,瞭解這些狀態是何時出現的,以及如何來使用這些狀態。首先,您需要學習在每種就緒狀態下可能碰到的是哪種請求狀態。不幸的是,這一點並不直觀,而且會涉及幾種特殊的情況。

隱秘就緒狀態

第一種就緒狀態的特點是 readyState 屬性為 0(readyState == 0),表示未初始化狀態。一旦對請求對象調用 open() 之後,這個屬性就被設定為 1。由於您通常都是在一對請求進行初始化之後就立即調用 open(),因此很少會看到 readyState == 0 的狀態。另外,未初始化的就緒狀態在實際的應用程式中是沒有真正的用處的。

不過為了滿足我們的興趣,請參見 清單 2 的內容,其中顯示了如何在 readyState 被設定為 0 時來擷取這種就緒狀態。

清單 2. 擷取 0 就緒狀態

function getSalesData() {
// Create a request object
createRequest();
alert(\"Ready state is: \" + request.readyState);

// Setup (initialize) the request
var url = \"/boards/servlet/UpdateBoardSales\";
request.open(\"GET\", url, true);
request.onreadystatechange = updatePage;
request.send(null);
}

在這個簡單的例子中,getSalesData() 是 Web 頁面調用來啟動請求(例如點擊一個按鈕時)所使用的函數。注意您必須在調用 open()之前 來查看就緒狀態。圖 1 給出了運行這個應用程式的結果。

圖 1. 就緒狀態 0

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.