1. 程式人生 > >HTTP和AJAX(五、網路狀態碼和AJAX狀態碼)

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');