Ajax- 讀取響應(yīng)首部
導(dǎo)航: 上一頁 | ASP | PHP | JSP | HTML | CSS | XHTML | aJAX | Ruby | JAVA | XML | Python | ColdFusion
你有時(shí)可能需要從服務(wù)器獲取一些內(nèi)容,例如,可能想“ping”一下服務(wù)器,驗(yàn)證服務(wù)器是否正常運(yùn)行。此時(shí),你也許只想讀取服務(wù)器發(fā)出的響應(yīng)首部,而忽略內(nèi)容。通過讀取響應(yīng)首部,可以得出Content-Type(內(nèi)容類型)、Content-Length(內(nèi)容長度),甚至Last- Modified(最后一次修改)的日期。
如果只關(guān)注響應(yīng)首部,完成這樣一個(gè)請(qǐng)求的標(biāo)準(zhǔn)做法是使用HEAD請(qǐng)求,而不是前面討論的GET或POST請(qǐng)求。當(dāng)服務(wù)器對(duì)HEAD請(qǐng)求做出響應(yīng)時(shí),它只發(fā)送響應(yīng)首部而忽略內(nèi)容,即使可以向?yàn)g覽器返回所請(qǐng)求的內(nèi)容,也不會(huì)真的把內(nèi)容返回。由于忽略了內(nèi)容,對(duì)HEAD請(qǐng)求的響應(yīng)比對(duì)GET或POST的響應(yīng)就小得多。
代碼清單4-3展示了從XMLHttpRequest對(duì)象獲取響應(yīng)首部的多種方法,并介紹了這些方法在實(shí)際中的使用。這個(gè)頁面有4個(gè)鏈接,分別對(duì)應(yīng)從XMLHttpRequest對(duì)象讀取響應(yīng)首部的各個(gè)方法。
代碼清單4-3 readingResponseHeaders.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=" <head>
<title>Reading Response Headers</title>
<script type="text/javascript">
var xmlHttp;
var requestType = "";
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function doHeadRequest(request, url) {
requestType = request;
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("HEAD", url, true);
xmlHttp.send(null);
}
function handleStateChange() {
if(xmlHttp.readyState == 4) {
if(requestType == "allResponseHeaders") {
getAllResponseHeaders();
}
else if(requestType == "lastModified") {
getLastModified();
}
else if(requestType == "isResourceAvailable") {
getIsResourceAvailable();
}
}
}
function getAllResponseHeaders() {
alert(xmlHttp.getAllResponseHeaders());
}
function getLastModified() {
alert("Last Modified: " + xmlHttp.getResponseHeader("Last-Modified"));
}
function getIsResourceAvailable() {
if(xmlHttp.status == 200) {
alert("Successful response");
}
else if(xmlHttp.status == 404) {
alert("Resource is unavailable");
}
else {
alert("Unexpected response status: " + xmlHttp.status);
}
}
</script>
</head>v <body>
<h1>Reading Response Headers</h1>
<a href="javascript:doHeadRequest('allResponseHeaders',
'readingResponseHeaders.xml');">Read All Response Headers</a>
<br/><br> <a href="javascript:doHeadRequest('lastModified',
'readingResponseHeaders.xml');">Get Last Modified Date</a>
<br/>
<a href="javascript:doHeadRequest('isResourceAvailable',
'readingResponseHeaders.xml');">Read Available Resource</a>
<br/><br> <a href="javascript:doHeadRequest('isResourceAvailable',
'not-available.xml');">Read Unavailable Resource</a>
</body>
</html>
頁面上第一個(gè)鏈接展示了XMLHttpRequest對(duì)象的getAllResponseHeaders()方法。這個(gè)方法只是將所有響應(yīng)首部獲取為一個(gè)串。在這個(gè)例子中,響應(yīng)首部顯示在警告框中。getAllResponseHeaders()方法的用途很有限,因?yàn)樗阉许憫?yīng)首部放在一起作為串返回。要想使用getAllResponseHeaders()方法來獲取單個(gè)的響應(yīng)首部,就需要解析返回的串,查找所關(guān)注的響應(yīng)首部。
getResponseHeader方法可以通過只返回一個(gè)響應(yīng)首部的值解決這個(gè)問題。這個(gè)方法取一個(gè)串參數(shù),該參數(shù)表示所需響應(yīng)首部的名字(就是你想得到這個(gè)響應(yīng)首部的值)。這個(gè)例子使用getResponseHeader方法將Last-Modified首部顯示在警告框中。在實(shí)際應(yīng)用中,getResponseHeader方法很可能用于以某個(gè)間隔輪詢服務(wù)器資源。只有自最近一次輪詢服務(wù)器資源以來Last-Modified響應(yīng)首部發(fā)生變化時(shí),瀏覽器才會(huì)根據(jù)服務(wù)器資源更新其內(nèi)容。
頁面上的后兩個(gè)鏈接使用了XMLHttpRequest對(duì)象的另一種能力,即檢查服務(wù)器返回的HTTP狀態(tài)碼。XMLHttpRequest對(duì)象的status屬性把HTTP狀態(tài)作為一個(gè)整數(shù)返回。如果狀態(tài)碼為200,指示這是正常的成功服務(wù)器響應(yīng)。相反,如果狀態(tài)碼是500,則指示服務(wù)器處理請(qǐng)求時(shí)出現(xiàn)了某種內(nèi)部錯(cuò)誤。
這個(gè)例子使用HTTP狀態(tài)碼來確定服務(wù)器資源是否可用。HTTP狀態(tài)碼404指示沒有所請(qǐng)求的資源。頁面上的Read Available Resource(讀取可用資源)鏈接請(qǐng)求位于服務(wù)器上的簡單的XML文件。因?yàn)榉?wù)器上有這個(gè)文件,所以HTTP狀態(tài)碼為200,指示這是成功的響應(yīng)。頁面上最后一個(gè)鏈接是Read Unavailable Resource(讀取不可用資源),它請(qǐng)求服務(wù)器上沒有的文件。服務(wù)器會(huì)用HTTP狀態(tài)碼404做出響應(yīng)。JavaScript事件處理程序檢查服務(wù)器響應(yīng),看到404狀態(tài)碼,顯示警告框指示所請(qǐng)求的資源不可用。
代碼清單4-4顯示了readingResponseHeaders.xml。
代碼清單4-4
readingResponseHeaders.xml
<?xml version="1.0" encoding="UTF-8"?>
<readingResponseHeaders>
</readingResponseHeaders>
顯示所有響應(yīng)首部的結(jié)果如圖4-3所示。圖4-4顯示了讀取Last-Modified首部的結(jié)果,圖4-5顯示了確定Web資源是否可用的結(jié)果。