vue axios最全攔截器封裝 請(qǐng)求頭配置 異常狀態(tài)統(tǒng)一處理 loading設(shè)置

注意點(diǎn):不要直接對(duì)axios原型設(shè)置攔截,先創(chuàng)建axios實(shí)例: axios.create
然后分別用到:
service.interceptors.request.use
service.interceptors.response.use

攔截器代碼:

import axios from 'axios';
import router from '../router';
import db from '@/utils/localstorage';
import { MessageBox, Message, Loading } from 'element-ui';
import store from '@/store';
import { getToken } from '@/utils/auth';
var aaa = 0
let nowUrl = '';

// 創(chuàng)建axios實(shí)例
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // 跨域請(qǐng)求時(shí)發(fā)送cookie
  baseURL: config.BASE_API,
  timeout: 30000 // 請(qǐng)求超時(shí)
});

// 請(qǐng)求攔截器
let loadingInstance = null;
service.interceptors.request.use(
  (config) => {
    nowUrl = config.url;
    // do something before request is sent
   
    var xtoken = localStorage.getItem('loginToken');
    config.headers['tenantPath'] = (window.location.pathname.split('/')[1] === 'sdm' ? window.location.pathname.split('/')[2] : window.location.pathname.split('/')[1]) || '';
    config.headers['t'] = store.getters.t;
    if (xtoken != null) {
      config.headers['X-User'] = getToken();
      config.headers['System'] = 'M';
      config.headers['crmversion'] = 'V1.0.0';
      config.headers['channel'] = 'PC';
      config.headers['Content-Type'] = 'application/json';
    }
  
    if (config.responseType === 'blob') {  // blob類(lèi)型 延長(zhǎng)超時(shí)時(shí)間
      config.timeout = 60000;
      loadingInstance = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    }
    if (config.url.includes('add') || config.url.includes('edit') || config.url.includes('update') || config.url.includes('create')) {
      loadingInstance = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    }
    if (config.url.indexOf('entrust/query/pagination')) {
      config.timeout = 300000;
    }
    if (config.url.includes('/member/import') || config.url.includes('/dataSetRoler/import')) { // 導(dǎo)入文件設(shè)置請(qǐng)求頭
      config.headers['Content-Type'] = 'multipart/form-data';
    }
    return config;
  },
  (error) => {
    // 處理請(qǐng)求錯(cuò)誤
    console.log(error); // for debug
    return Promise.reject(error);
  }
);

// 響應(yīng)攔截器
service.interceptors.response.use(
  /**
   * 如果您想獲得http信息月腋,例如頭信息或狀態(tài)信息
   * 請(qǐng)返回 response => response
   */

  /**
   * 通過(guò)自定義代碼確定請(qǐng)求狀態(tài)
   * 這里只是一個(gè)例子
   * 還可以通過(guò)HTTP狀態(tài)代碼來(lái)判斷狀態(tài)
   */
  (response) => {
    if (response.config.responseType === 'blob') {  // 下載時(shí)直接return 返回blob
      loadingInstance && loadingInstance.close();
      return response.data;
    }
    if (response.config.url.includes('add') || response.config.url.includes('edit') || response.config.url.includes('update') || response.config.url.includes('create')) {
      loadingInstance && loadingInstance.close();
    }
    const res = response.data;
    // 如果狀態(tài)碼不是0缀辩,則判斷為錯(cuò)誤。
    if (res.status !== 0 && res.status !== 200) {
      if (res.status == '400') {
        Message.closeAll(); // 關(guān)閉之前的彈出信息
        Message({
          dangerouslyUseHTMLString: true,
          message: res.message || 'Error',
          type: 'error',
          duration: 5 * 1000
        });
      }

      // 50008: 非法的令牌; 50012: 其他客戶(hù)端登錄; 50014: 令牌過(guò)期;
      if (res.code === 401 || res.code === 50012 || res.code === 50014) {
        // 重新登陸
        MessageBox.confirm('很抱歉,登錄已過(guò)期,請(qǐng)重新登錄', {
          confirmButtonText: '重新登錄',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload();
          });
        });
      }
      return Promise.reject(res);
    } else {
      return res;
    }
  },
  (error) => {
    console.log('err' + error.request.response); // for debug
    if (!error.request.response) {
      Message({
        message: '服務(wù)連接失敗',
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject(error);
    }
    const err = JSON.parse(error.request.response);
    loadingInstance && loadingInstance.close();
    if (nowUrl.indexOf('/menu/getList') != '-1') {
      return Promise.reject(error);
    } 
    if (error.request &&
      error.request.response &&
      JSON.parse(error.request.response) &&
      JSON.parse(error.request.response).status === 600 &&
      JSON.parse(error.request.response).message) {
      return Promise.reject(error);
    }
    if (err.status === 401 && nowUrl.indexOf('/menu/getList') == '-1') {
      // 重新登陸
      if (aaa == 0) {
        aaa++
        MessageBox.confirm('很抱歉,登錄已過(guò)期锹漱,請(qǐng)重新登錄', {
          confirmButtonText: '重新登錄',
          showCancelButton: false,
          type: 'warning'
        }).then(() => {
          db.remove('router')
          db.remove('loginToken')
          aaa = 0
          router.push({ path: '/login' });
        });
      }
      return Promise.reject(error);
    }
   
    if (
      error.request &&
      error.request.response &&
      JSON.parse(error.request.response) &&
      JSON.parse(error.request.response).status == 400 &&
      JSON.parse(error.request.response).message
    ) {
      Message({
        message: JSON.parse(error.request.response).message,
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject(error);
    }
    if (error.message.indexOf('timeout') !== -1) {
      Message({
        message: '請(qǐng)檢查網(wǎng)絡(luò)后重試',
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject(error);
    } else {
      Message({
        message: JSON.parse(error.request.response).message,
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject(error);
    }
  }
);

export default service;

上面我們對(duì)響應(yīng)狀態(tài) 401 500 其他等狀態(tài)的錯(cuò)誤處理封裝的很詳細(xì),以及code異常時(shí)的提示都做了處理类溢;
在調(diào)用時(shí)不需要再處理 異常status 或者異常code 的情況凌蔬,小心頁(yè)面上發(fā)生兩次錯(cuò)誤提示哈露懒!

注意上面是 export default service; 有default, 所以我們?cè)赼pi文件里引用時(shí) import request from '@/utils/request' ,這里的request可以是任何自定義的名稱(chēng)~

調(diào)用接口代碼:manage.js

import request from '@/utils/request'
const prefix = 'web'

export function getKey() {
  return request({
    url: prefix + '/member/ldap/getKey',
    method: 'get'
  });
}

export function getValidCode(data) {
  return request({
    url: prefix + '/captcha',
    method: 'get',
    data
  });
}

封裝到上面的程度后砂心,每次調(diào)用接口時(shí)需要 把manage.js 里的方法一個(gè)個(gè)import進(jìn)來(lái)懈词,非常不方便
可以看我下篇筆記,只需要一步一次輸出manage.js文件所有方法辩诞,在調(diào)用時(shí)就不需要逐個(gè)引入啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坎弯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子译暂,更是在濱河造成了極大的恐慌抠忘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外永,死亡現(xiàn)場(chǎng)離奇詭異崎脉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伯顶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)囚灼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祭衩,你說(shuō)我怎么就攤上這事灶体。” “怎么了掐暮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蝎抽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我路克,道長(zhǎng)樟结,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任衷戈,我火速辦了婚禮狭吼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殖妇。我一直安慰自己,他們只是感情好破花,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布谦趣。 她就那樣靜靜地躺著,像睡著了一般座每。 火紅的嫁衣襯著肌膚如雪前鹅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天峭梳,我揣著相機(jī)與錄音舰绘,去河邊找鬼蹂喻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捂寿,可吹牛的內(nèi)容都是我干的口四。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秦陋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔓彩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驳概,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赤嚼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顺又,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體更卒,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年稚照,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹂空。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐锣,死狀恐怖腌闯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雕憔,我是刑警寧澤姿骏,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站斤彼,受9級(jí)特大地震影響分瘦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琉苇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一嘲玫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧并扇,春花似錦去团、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肴熏,卻和暖如春鬼雀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛙吏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工源哩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞋吉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓励烦,卻偏偏與公主長(zhǎng)得像谓着,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崩侠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容