與服務器進行數據交互的方法——ajax,axios,fetch

一,與服務器交互的類型javascript

  同步交互:前端

    理解1:同步是阻塞模式,同步交互時,兩個線程的運行是相關的,a線程在運行時,b線程要阻塞等待,直到a線程運行完畢java

    理解2:同步交互時,客戶端發出請求後,須要等待服務器相應結束之後,才能發出第二個請求。node

    例:再作用戶登陸功能時,必須檢測用戶名密碼都正確之後才能進入系統。jquery

  異步交互:ios

    理解1:異步是非阻塞模式,異步交互時,兩個線程的運行不相關,a線程運行時,b線程也正常運行。ajax

    理解2:異步交互時,客戶端發出請求後,不須要等待服務器相應結束,就能夠發出第二個請求。npm

    例:用戶登陸系統後,系統會刷新系統頁面數據,此時存在多個數據接口與服務器進行交互,好比文字顯示部分的數據接口已經交互完成,但圖片顯示部分還在加載(可能接口還將來得及發出請       求,也可能接口發出請求後還未得到響應)。axios

二,交互方式之ajaxapi

  定義:AJAX是「Asynchronous Javascript And XML的縮寫,翻譯成中文就是異步JavascriptXML」。即便用js語言與服務器進行交互,傳輸的數據爲XML(不僅是XML)

  實現:

    1.XMLHttpRequest對象

      用於在後臺與服務器進行交互數據

//建立XMLHttpRequest對象
    const variable1 = new XMLHttpRequest();
    //老版本瀏覽器
    //const variable2 = new ActiveObject('Microsoft.XMLHTTP');


    //爲了兼容:
    let xmlhttp;
    if (window.XMLHttpRequest) {
      xmlhttp = new XMLHttpRequest();
    } else {
      xmlhttp = new ActiveObject('Microsoft.XMLHTTP');
    }
    或者
    function createXMLHttpRequest(){
      try{
            return new XMLHttpRequest();
          }catch(e){
             return new ActiveObject('Microsoft.XMLHTTP')
           }          
    }

          2.向服務器發送請求

      此時用到XMLHttpRequest對象的open()和send()方法:open(),send();

open(method,url,async)
  method:請求類型GET,POST,PUT
  url:請求地址
     async:true(異步)或false(同步)
send(string)
     string:僅用於POST請求。                

    3.服務器相應:

       若是想得到來自服務器的相應,請使用XMLHttpRequest對象的responseText或者responseXML。

    4.onreadystatechange

     當請求被髮送到服務器時,咱們須要執行一些基於響應的任務。每當 readyState 改變時,就會觸發 onreadystatechange 事件。

     readyState 屬性存有 XMLHttpRequest 的狀態信息,狀態從0-4發生變化。

      0:請求未初始化,

      1:服務器鏈接已經創建,

      2:請求已經接收,

      3:請求處理中,

      4:請求已完成,且響應已就緒。

    另外服務器的狀態碼:

      200:‘成功’,404:‘未你找到頁面’,500:服務器內部錯誤,401:訪問資源的權限不足,等;

    5.最終實現

      

function creatXmlHttpRequest() {
      let xmlHttp
      try {
        xmlHttp = new XMLHttpRequest();
      } catch (e) {
        xmlHttp = new ActiveXObject('Microsift.XMLHTTP')
      }
      return xmlHttp;
    }
    let xmlHttp = creatXmlHttpRequest();
    xmlHttp.onreadystatechange = function () {
      if (xmlHttp.readystate === 4 && xmlhttp.status === 200) {
        document.getElementById('myDiv').innerHTML = xmlhttp.responseText;
      }
    }
    xmlhttp.open("GET", "url", true);
    xmlhttp.send();

   /*
    建立XMLHttpRequest對象;
    調用open()方法打開與服務器的鏈接;
    調用send()方法發送請求;
    爲XMLHttpRequest對象指定onreadystatechange事件函數,這個函數會在
    XMLHttpRequest的狀態改變時被調用;一般咱們只關心狀態爲4的時候。
    XMLHttpRequest對象的status屬性表示服務器狀態碼,它只有在readyState爲4時才能獲取到。
    XMLHttpRequest對象的responseText屬性表示服務器響應內容,它只有在
    readyState爲4時才能獲取到!
  */

//jQuery ajax實現:
$.ajax({
   type: 'POST', url: url, data: data, dataType: dataType, success: function () {}, error: function () {} });
 

  注意:

    1.ajax使用javascript技術向服務器發送異步請求,無須刷新整個頁面(性能提高)

    2.ajax雖然提升了用戶體驗,但無形中向服務器發送的請求次數增多了,致使服務器壓力增大

    3.由於ajax是在瀏覽器中使用Javascript技術完成的,因此還須要處理瀏覽器兼容性問題;

    4.JQueryajax基於原生的XHR開發,另外JQuery整個項目太大,單純使用ajax卻要引入整個JQuery很是的不合理.(JQueryajax 不符合如今前端MVVM的浪潮

    5.MVVM 的核心是 ViewModel 層,它就像是一箇中轉站,負責轉換 Model 中的數據對象來讓數據變得更容易管理和使用,該層向上與視圖層進行雙向數據綁定,向下與 Model 層經過接口請求進行數據交互,起呈上啓下做用。

三,交互方式之axios

  定義:基於promise用於瀏覽器和node.js的http客戶端

   安裝

    1.npm 安裝:  $npm install axios

    2.bower安裝:$bower install axios

    3.CDN引入:<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

   實現方式:

axios({
    method: method,    //method:GET,POST,PUT
    url: url,         //請求地址
    data:data,     //請求參數  {username:'eee',password:'123456'};
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});    

/*另一種方式*/
//GET
axios.get('/getData?ID=12')
  .then(function(response){
  console.log(response)
}).catch(function(e){console.log(e)});
或者:
axios.get('/getData',{params:{ID:12}}})
  .then(function(response){
  console.log(response)
}).catch(function(e){console.log(e)});

//POST
axios.post('/login',{
  name:'chenke',
  password:'123456'
}).then(function(response){
  console.log(response)
}).catch(function(e){console.log(e)});
 
 

    同時執行多個併發請求:

function getData1(){
   return axios.get('/getData?ID=19');  
}

function getData2(){
   return axios.get('/getData?ID=20');  
}

axios.all([getData1(),getData2()])
.then(axios.spread(function(response1,response2){
   //兩個請求都執行完成。
}))

  注意:

    1.從node.js建立http請求,支持Promise API,客戶端支持防止CSRF(跨站請求僞造)

    2.能轉換請求和響應數據,能攔截請求和響應,能自動轉換JSON數據,也能取消請求。

四,交互方式之fetch

  和XMLHttpRequest(XHR)同樣,Fetch也是瀏覽器的原生API(沒有使用XMLHttpResquest),jquery的ajax實際上是封裝了XHR.

  實現:

fetch('/servers/getData',{ID='1'})   //fetch(url,options)
    .then((response)=>{
      console.log(response);
       return response;
}).catch(e=>{
    console.log(e);
    return e;
})           
/*
   1.fetch api返回的是一個promise
   2.options:
         -method:HTTP請求方法,默認GET  
         -body:請求參數
         -header(Object):請求頭,默認爲{}
         -credentials:默認爲omit,忽略的意思,也就是不帶cookie,還有兩個參數,same-origin,意思是同源請求帶cookie;include,表示不管跨域仍是同源請求都會帶cookie
*/

fetch優勢:

  1.寫法更簡單,基於標準promise實現,脫離XHR,是ES裏的實現方式,支持asyn/await。  

fetch缺點:

  1.fetch只對網絡請求報錯,對400,500都當作成功的請求,服務器返回4xx(400,401等),5xx錯誤碼時並不會reject,只有其餘的網絡錯誤致使請求不能完成時,fetch纔會被reject.

  2.fetch默認不帶cookie,須要在options裏添加配置項,{credentials:‘include’}

  3.fetch沒有辦法原生檢測請求的進度,而XHR能夠。

  4.fetch不支持abort,不支持超時控制,使用setTimeOut及Promise.reject實現的超時控制並不能阻止請求過程繼續在後臺運行,浪浪費流量。

相關文章
相關標籤/搜索