【vue學(xué)習(xí)】axios

Ajax、fetch、axios的區(qū)別與優(yōu)缺點(diǎn)

axios的github地址

原生ajax

    //創(chuàng)建異步對(duì)象  
    var xhr = new XMLHttpRequest();
    //設(shè)置請(qǐng)求基本信息,并加上請(qǐng)求頭
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xhr.open('post', 'test.php' );
    //發(fā)送請(qǐng)求
    xhr.send('name=Lan&age=18');
    xhr.onreadystatechange = function () {
        // 這步為判斷服務(wù)器是否正確響應(yīng)
      if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.responseText);
      } 
    };

jqueryAjax

var loginBtn =  document.getElementsByTagName("button")[0];
loginBtn.onclick = function(){
    ajax({
        type:"post",
        url:"test.php",
        data:"name=lan&pwd=123456",
        success:function(data){
           console.log(data);
        }
    });
}

fetch

fetch('http://www.mozotech.cn/bangbang/index/user/login', {
    method: 'post',
    headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: new URLSearchParams([
        ["username", "Lan"],["password", "123456"]
    ]).toString()
})
.then(res => {
    console.log(res);
    return res.text();
})
.then(data => {
    console.log(data);
})

axios

axios({
    method: 'post',
    url: '/abc/login',
    data: {
        userName: 'Lan',
        password: '123'
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

同時(shí)發(fā)起多個(gè)請(qǐng)求:


image

對(duì)比

  1. 幾種方式的對(duì)比
    ajax:
    優(yōu)點(diǎn):局部更新;原生支持】
    缺點(diǎn):可能破壞瀏覽器后退功能;嵌套回調(diào)】
    jqueryAjax:
    【在原生的ajax的基礎(chǔ)上進(jìn)行了封裝;支持jsonp】
    fetch:
    優(yōu)點(diǎn):解決回調(diào)地獄】
    缺點(diǎn):API 偏底層,需要封裝;默認(rèn)不帶Cookie,需要手動(dòng)添加; 瀏覽器支持情況不是很友好,需要第三方的ployfill】
    axios:
    【幾乎完美】

  2. axios的特點(diǎn)
    支持瀏覽器和node.js
    支持promise
    攔截請(qǐng)求和響應(yīng)
    能轉(zhuǎn)換請(qǐng)求和響應(yīng)數(shù)據(jù)
    取消請(qǐng)求
    自動(dòng)轉(zhuǎn)換JSON數(shù)據(jù)
    瀏覽器端支持防止CSRF(跨站請(qǐng)求偽造)

axios提問

  1. 如何將axios異步請(qǐng)求同步化處理?
//使用 asyns/await 
async getHistoryData (data) {
 try {
   let res = await axios.get('/api/survey/list/', {
     params: data
   })
   this.tableData = res.data.result
   this.totalData = res.data.count
 } catch (err) {
   console.log(err)
   alert('請(qǐng)求出錯(cuò)!')
 }
}
  1. 為何官方推薦使用axios而不用vue-resource?

    Vue1.x中,官方推薦使用的ajax庫是vue-resource。到了Vue2.x,官方(尤大)推薦的ajax庫改為了Axios,按照說法是因?yàn)橐延幸粋€(gè)更完備的輪子,就不需要造一個(gè)新的。

  2. 你了解axios的原理嗎?有看過它的源碼嗎?

    Axios源碼深度剖析

  3. 你有封裝過axios嗎?主要是封裝哪方面的?

    具體config配置參考

    image

    到具體頁面中的應(yīng)用:
    image

  4. 如何中斷(取消)axios的請(qǐng)求?

    image

  5. axios怎么解決跨域的問題?

    image

    • 如果 server 端是自己開發(fā)的,那么修改相關(guān)代碼支持跨域即可。如果不是自己開發(fā)的,那么可以自己寫個(gè)后端轉(zhuǎn)發(fā)該請(qǐng)求,用代理的方式實(shí)現(xiàn)。

    • 跨域這個(gè)行為是瀏覽器禁止(瀏覽器不允許當(dāng)前頁面的所在的源去請(qǐng)求另一個(gè)源的數(shù)據(jù))的,但是服務(wù)端并不禁止

    • 源指協(xié)議、端口、域名。只要這個(gè)3個(gè)中有一個(gè)不同就是跨域。 這里列舉一個(gè)經(jīng)典的列子:

      協(xié)議跨域:
      http://a.baidu.com訪問https://a.baidu.com;
      端口跨域:
      http://a.baidu.com:8080訪問http://a.baidu.com:80;
      域名跨域:
      http://a.baidu.com訪問http://b.baidu.com;
      
    • 關(guān)鍵字:Access-control-Allow-origin、跨域

    • 幾種解決跨域的方法

    • A) 開發(fā)模式下,可以在config中配置proxyTable即可

      image

    • B) 服務(wù)端基于spring實(shí)現(xiàn)


      image
    • C) CORS:①即跨源資源共享,它定義了一種瀏覽器和服務(wù)器交互的方式來確定是否允許跨域請(qǐng)求。 ②它是一個(gè)妥協(xié),有更大的靈活性,但比起簡(jiǎn)單地允許所有這些的要求來說更加安全。③但是CORS也具有一定的風(fēng)險(xiǎn)性,比如請(qǐng)求中只能說明來自于一個(gè)特定的域但不能驗(yàn)證是否可信,而且也容易被第三方入侵。 ④這里一般需要后端配合,開啟cors。一般各種語言都有類似的包。比如NodeJS的koa2-cors

      image

    • D) Nginx代理proxy

      image

    • E) express代理

      image

    • 請(qǐng)求頭自動(dòng)攜帶cookie時(shí):config中配置withCredentials:true,否則為false【看到有人說:withCredentialstrue的情況下,后端要設(shè)置Access-Control-Allow-Origin為你的源地址,例如http://localhost:8080,不能是*,而且還要設(shè)置header('Access-Control-Allow-Credentials: true')

    • config中配置qs:避開ajax信使請(qǐng)求,并兼容Android?

    import Qs from 'qs'
    
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • axios get 方法總結(jié): 獲取數(shù)據(jù)的方法 1.基本語法: axios.get 2.將請(qǐng)求參數(shù)單 3,將請(qǐng)求...
    糖醋里脊120625閱讀 3,015評(píng)論 0 1
  • 1. 什么是同源策略 瀏覽器限制不同源的兩個(gè)網(wǎng)站間腳本和文本的相互訪問,只允許訪問同源下的內(nèi)容。所謂同源,就是指兩...
    熊蛋子17閱讀 763評(píng)論 1 6
  • 一、什么是跨域 url的組成 JavaScript出于安全方面的考慮,不允許跨域調(diào)用其他頁面的對(duì)象。那什么是跨域呢...
    古城凌三少閱讀 4,767評(píng)論 0 0
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,143評(píng)論 0 2
  • 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,414評(píng)論 0 6

友情鏈接更多精彩內(nèi)容