幾年很流行Ajax,而Ajax 的本質就是XMLHttpRequest,是客戶端XMLHttpRequest 物件的使用。相對於Ajax,服務端XMLHTTP 就是在服務端使用XMLHttpRequest 物件了。雖然說,在服務端使用非同步請求是比較不方便的,但是做為可以服務端發送HTTP 請求的元件,學習一下也是沒有壞處的。
這裡,我講的是在ASP 環境中使用服務端XMLHttpRequest,並以JScript 做為示範程式碼的語言,因此,你需要了解ASP 以及JScript。
服務端XMLHTTP,通常會用在取得遠端主機的網頁或其他內容,新聞聚合系統通常就是使用服務端XMLHTTP 物件來取得要聚合的Feed 的內容,然後使用XMLDOM 物件分析Feed 的內容,取出新聞的標題、作者、內容等信息,再存在資料庫中,然後將若干個資料來源的新聞一起顯示在一起。抓蝦就是這樣一個新聞聚合器,但它不是用ASP 寫的就是了:)
在ASP 中,我們可以用以下程式碼來建立一個ServerXMLHTTP 對象,而這個對象,就是我們在服務端進行所有操作的基礎。
複製代碼代碼如下:
var xmlhttp = new ActiveXObject(MSXML2.ServerXMLHTTP.5.0);
首先來了解ServerXMLHTTP 物件有哪些比較有用的方法:
1. abort 這個方法用來取消XMLHTTP 的請求。如果XMLHTTP 物件以非同步方式傳送請求,如果到達一定的時間請求仍然沒有返回,就可以使用這個方法來取消請求。
2. getAllResponseHeaders 這個方法的回傳值是一個字串,相當於HTTP 請求的頭部去掉了請求方法、URI和協定版本資訊。
3. getResponseHeader 這個方法用來獲取指定頭部信息,比較有用的就是可以用來獲取返回數據的Content-Type、Referer 等。
4. open 使用指定的請求方法、URI和同步方式以及認證資訊等初始化一個請求。
5. send 發送HTTP 請求,等待接收回應數據,注意,如果是以同步方式發送請求,send方法調用後不會立即返回,而是等到請求完成後才會返回,而以異步方法請求時,則會立即返回。另外,send方法附帶一個可選參數body,表示要傳送的數據,這在使用POST 方法時比較有用。
6. setTimeout 設定ServerXMLHTTP 物件的4 個逾時時間,分別是:網域名稱解析、連接伺服器、傳送資料、接收回應。可以透過設定對應的逾時時間來控制ServerXMLHTTP 對象,以免ServerXMLHTTP 無法及時返回而造成程式停止回應。
7. setRequestHeader 設定請求的Header,在客戶端XMLHttpRequest中,通常用來設定請求的資料類型,或是識別請求的方法等等,例如jquery 會增加頭部識別X-Request-With,表示請求是從XMLHttpRequest 對象發出,以方便服務端做出相應的動作。
8. waitForResponse 在使用非同步方式傳送請求時,可以用這個方法來控制請求的進程。在服務端腳本中,不可以像客戶端那樣直接使用回調函數來控制非同步請求,也沒有對應的函數來使用程式休眠一定的時間,因此,為了等待請求返回,我們可以使用這個方法來等待一定時間。
另外,還有其他一些方法,如getOption、setOption、setProxy 等,這些方法用得比較少,因此這裡不再介紹,需要了解的朋友可以查閱MSDN。
接下來,再看看ServerXMLHTTP 物件的屬性:
1. onreadystatechange XMLHTTP 物件狀態改變時的回呼函數,這個屬性為非同步操作奠定了一個基礎,可以讓程式在不用查詢XMLHTTP 物件狀態的情況獲知XMLHTTP 操作是否已經完成。
2. readyState XMLHTTP 物件狀態,有5 個值,從0 到4,分別代表的意思是:
0 - 未初始化,剛使用new ActiveXObject(MSXML.ServerXMLHTTP.5.0) 建立時物件所處的狀態
1 - 載入中,這個時候,已經呼叫了open 方法,但是還沒有使用send 方法發送數據
2 - 已經載入,已經呼叫了send 方法發送數據,但是還沒有可用的回應流
3 - 正在交互,正在接收數據,這個時候可以使用responseBody 和responseText 屬性來獲取已經得到的部分數據了
4 - 完成請求,全部資料已經接收完成
通常情況下,我們只需要判斷一下狀態4 即可,這個時候資料已經全部載入,使用responseBody 或responseText 屬性就能取得所需的資料。
3. status HTTP 回應狀態碼,正常情況應該為200,如果請求的資源不存在,就會回傳404,還有其他狀態碼如伺服器錯誤500 等。
4. statusText HTTP 回應狀態文本,用於描述回應狀態碼所代表的意思,諸如200 OK 中的OK,404 Not Found 中的Not Found
5. responseBody 回應資料的位元組數組,這在VBScript 裡是可以直接使用的,但是在JScript 裡就需要轉換過了。
6. responseText 以文字方式取得回應數據
7. responseXML 將回應資料作為一個XMLDOM 物件來傳回,這在請求的資料是一個XML 文件時特別有用
8. responseStream 回應流對象,這個屬性不常用