HTTP和AJAX(五、網路狀態碼和AJAX狀態碼)
**第三部分細節探究**
''''javascript(以下為基於原生JS實現AJAX的第三步的具體解析)
//=>監聽AJAX狀態的改變,獲取響應資訊(獲取響應頭資訊、獲取響應主體資訊)
xhr.onreadystatechange=()=>{
if(xhr.readyState===4&&xhr.status===200){
let result=xhr.responseText;//=>獲取響應主體中的內容
}
};
>
let xhr new XMLHttpRequest;
dir(xhr)
***Ajax狀態碼:描述當前AJAX操作的狀態的
>xhr.readyState:包含從0到4,五種狀態
>0:UNSENT,未傳送,只要建立一個AJAX物件,預設值就是0
>1:OPENED,我們已經執行了xhr.open這個操作
>2:HEADERS_RECEIVED當前AJAX的請求已經發送,並且已經接收到伺服器端返回的響應頭資訊了
>3:LOADING,相應主體的內容正在返回的路上
>4:DONE,響應主體內容已經返回到客戶端
***HTTP網路狀態碼
>HTTP網路狀態碼:記錄了當前伺服器返回資訊的狀態:xhr.status(百度檢視即可)
>成功:200,一個完整的HTTP事務完成(以2開頭的狀態碼一般都是成功)
>以3開頭的一般也是成功,只不過伺服器端做了很多特殊的處理
301:Moved Permanently 永久轉移(永久重定向),,一般應用於域名的遷移,,如360buy,會轉到京東網站上
302:Moved temporarily 臨時轉移(臨時重定向,新的HTTP版本中任務307是臨時重定向)
'''一般用於伺服器的負載均衡:當前伺服器處理不了,我把當前請求臨時交給其他的伺服器處理
(一般圖片請求經常出現302,很多公司都有單獨的圖片伺服器)
304:Not Modified 從瀏覽器快取中獲取資料‘把一些不經常更新的檔案或者內容快取到瀏覽器中,下一次從快取中獲取,減輕伺服器壓力,也提高頁面的載入速度’
>以4開頭的,一般都是失敗,而且客戶端的問題偏大
400:請求引數錯誤(引數不夠或者引數錯誤)
401:無許可權訪問
404:訪問地址不存在
>以5開頭的,一般都是失敗,而且伺服器的問題偏大
>500:Internal Server Error 未知的伺服器錯誤
>503:Service Unavailable 伺服器超負載
>
**-AJAX中其它常用的屬性和方法-**
>面試題:AJAX中總共支援幾個方法:
let xhr=new XMLHttpRequest():
dir(xhr)
>1.readystate:儲存的是當前AJAX的狀態碼
2.response/responseText/responseXML:都是用來接收伺服器返回的響應主體中的內容,
只是根據伺服器返回內容格式不一樣,我們使用不同屬性接受即可
++responseText:是最常用的,接收到的結果是字串格式的(一般伺服器返回的資料都是JSON格式字串)
++responseXML:偶爾會用到,如果伺服器端返回的是XML文件資料,我們需要使用這個屬性接受
3. status:記錄了伺服器端返回的HTTP狀態碼
statusTEXT:對返回狀態碼的描述
4.timeout:設定當前AJAX請求的超時時間,假設我們設定篩檢為3000(MS),從AJAX請求傳送開始,3秒後響應主體內容還沒返回,瀏覽器會把當前AJAX請求任務強制斷開
[方法]
>1.abort():強制中斷AJAX請求
>2.getAllResponseHeaders():獲取全部的響應頭資訊(獲取的結果是一堆字串文字)
>3.getResponseHeader(key):獲取指定屬性名的 響應頭資訊,例如:xhr.getResponseHeader('date') 獲取響應頭中儲存的伺服器的時間
>4.open():開啟一個URL地址
>5.overrideMimeType():重寫資料的MIME型別
>6.send():傳送AJAX請求(括號中書寫的內容是客戶端基於請求主體把資訊傳遞給伺服器)
>7.setRequestHeader(key,value):設定請求頭資訊(可以是設定的自定義請求頭資訊)
[事件]
>1.onabort:當AJAX被中斷請求觸發這個事件
>2.onreadystatechange:AJAX狀態發生改變,會觸發這個事件
>3.ontimeout:當AJAX請求超時,會觸發這個事件
>......
>
******JavaScript(同步時間的程式碼實現)
//獲取客戶端時間
let xhr=new XMLHttpRequest();
xhr.open('get','temp.json?_='+Math.random(),true);//=>????清除快取
xhr.setRequestHeader('aaaa','xxx');//=>請求頭部的內容不能是中文字元;;設定請求頭資訊必須在OPEN之後和SEND之前
//=>設定超時
xhr.timeout=100000;
xhr.ontimeout=()=>
{
console.log('當前請求已經超時')
xhr.abort();
}
//獲取伺服器端的時間呈現在客戶端
xhr.onreadystatechange=()=>{
let(readyState:state,status)=xhr;
//=>說明請求資料成功了
if(!/^(2|3)\d{2}$/.test(status)) return;
};
//=>在狀態為2的時候就可以獲取響應頭資訊了
if (state===2){
let headerAll=xhr.getAllResponseHeaders();
serverDate=xhr.getResponseHeader('date');//=>獲取的伺服器時間是格林尼治時間(相比於北京時間差了8小時)
console.log(headerAll,new date(serverDate));//=>new引數serverDate後,把時間轉化為北京時間
return;
}
//=>在狀態為4的時候響應主體內容就已經回來了
if(state===4)
{
let valueText=xhr.responseText();//=>獲取到的結果一般都是Json字串(可以使用JSON.PARSE把其轉換為物件)
valueXML=xhr.responseXML('date');//=>獲取到的結果是XML格式的資料(可以通過XML的一些常規操作獲取儲存的指定資訊) 如果伺服器返回的是XML文件,responseText獲取的結果是字串而responseXML獲取的是標準XML文件
console.log(valueText,valueXML);
}
}
xhr.send('name=zxt&age=28&sex=man');