相對於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 響應流對象,這個屬性不常用