vue 封裝 Axios 接口與異常處理

1.新建文件夾api

如圖

2. http.js

進(jìn)行axios封裝赃承, 請(qǐng)求攔截、響應(yīng)攔截晚凿、錯(cuò)誤統(tǒng)一處理
代碼如下:

import axios from 'axios';
/**請(qǐng)求失敗后的錯(cuò)誤統(tǒng)一處理 */
const errorHandle = (status, other) => {
    // 狀態(tài)碼判斷
    switch (status) {
        // 401: 未登錄狀態(tài)灭袁,跳轉(zhuǎn)登錄頁
        case 401:
            toLogin();
            break;
        // 403 token過期
        // 清除token并跳轉(zhuǎn)登錄頁
        case 403:
            tip('登錄過期班利,請(qǐng)重新登錄');
            localStorage.removeItem('token');
            store.commit('loginSuccess', null);
            setTimeout(() => {
                toLogin();
            }, 1000);
            break;
        // 404請(qǐng)求不存在
        case 404:
            alert('請(qǐng)求的資源不存在');
            break;
        default:
            console.log(other);
        }
}

// 創(chuàng)建axios實(shí)例
const instance = axios.create({ timeout: 1000 * 12});
// 設(shè)置post請(qǐng)求頭
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
/**
 * 請(qǐng)求攔截器
 * 每次請(qǐng)求前,如果存在token則在請(qǐng)求頭中攜帶token
 */
instance.interceptors.request.use(
    config => {
      let token = window.localStorage.getItem('token');
      if (token) { //判斷token是否存在
        config.headers.Authorization = token;  //將token設(shè)置成請(qǐng)求頭
      }
      return config;
    },
    err => {
      return Promise.reject(err);
    }
  );
/**
 * 響應(yīng)攔截器
 * 判斷登錄是否過期犀变,斷網(wǎng)處理
 */
instance.interceptors.response.use(
 // 請(qǐng)求成功
    res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
    // 請(qǐng)求失敗
    error => {
        const { response } = error;
        if (response) {
            // 請(qǐng)求已發(fā)出妹孙,但是不在2xx的范圍
            errorHandle(response.status, response.data.message);
            return Promise.reject(response);
        } else {
            // 處理斷網(wǎng)的情況
            // eg:請(qǐng)求超時(shí)或斷網(wǎng)時(shí),更新state的network狀態(tài)
            // network狀態(tài)在app.vue中控制著一個(gè)全局的斷網(wǎng)提示組件的顯示隱藏
            // 關(guān)于斷網(wǎng)組件中的刷新重新獲取數(shù)據(jù)获枝,會(huì)在斷網(wǎng)組件中說明
            // store.commit('changeNetwork', false);
        }
    });

export default instance;

2. base.js

接口域名的管理蠢正,代碼如下

const base = {
    baseURL:'http://localhost:3000'
};
export default  base;

3. todos.js

todos模塊接口列表,代碼如下:

import http from './http'; //封裝的攔截器及錯(cuò)誤處理的axios
import base from './base'; //配置的接口域名

const todosApi = {
   getTodoList (){
        return http.get(`${base.baseURL}/getTodoList`)
    },
   addTodoList (data){
        return http.post(`${base.baseURL}/addTodoList`,{
            ...data,
        })
    }
};
export default  todosApi;

4.index.js

api接口的統(tǒng)一出口省店,利于多人協(xié)作開發(fā)
代碼如下:

// todos模塊接口
import todosApi from './todos';
// 其他模塊的接口……

// 導(dǎo)出接口
export default {
    todosApi,
    // ……
}

5.main.js中去掛載axios

import api from './api'  //相當(dāng)于引入index.js中導(dǎo)出的api接口
Vue.prototype.$api = api;  // 將api掛載到vue的原型上

6.TodoList.vue 組件中去調(diào)用接口

created(){
     this.getTodos()
},
 methods:{
     // 得到數(shù)據(jù)
     getTodos(){
       this.$api.todosApi.getTodoList()   //可直接調(diào)用todosApi中的方法
             .then(res=> {
                   this.todos = res.data.todos;
             })  
       },
    // 添加數(shù)據(jù)
     addTodos(){
       this.$api.todosApi.addTodoList({
              name: 'little fairy',
              age: 12
        })  
        .then(res=> {
               this.todos = res.data.todos;
         })  
    },
}

總結(jié):
這樣可以統(tǒng)一的操作api接口嚣崭,進(jìn)行統(tǒng)一的封裝,及異常處理懦傍,便于后期的維護(hù)更新雹舀,以及提高代碼的簡(jiǎn)潔性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粗俱,隨后出現(xiàn)的幾起案子说榆,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件签财,死亡現(xiàn)場(chǎng)離奇詭異串慰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唱蒸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門邦鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人油宜,你說我怎么就攤上這事掂碱×耍” “怎么了慎冤?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沧卢。 經(jīng)常有香客問我蚁堤,道長(zhǎng),這世上最難降的妖魔是什么但狭? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任披诗,我火速辦了婚禮,結(jié)果婚禮上立磁,老公的妹妹穿的比我還像新娘呈队。我一直安慰自己,他們只是感情好唱歧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布宪摧。 她就那樣靜靜地躺著,像睡著了一般颅崩。 火紅的嫁衣襯著肌膚如雪几于。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天沿后,我揣著相機(jī)與錄音沿彭,去河邊找鬼。 笑死尖滚,一個(gè)胖子當(dāng)著我的面吹牛喉刘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漆弄,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼睦裳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了置逻?” 一聲冷哼從身側(cè)響起推沸,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鬓催,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肺素,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年宇驾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倍靡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡课舍,死狀恐怖塌西,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筝尾,我是刑警寧澤捡需,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站筹淫,受9級(jí)特大地震影響站辉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜损姜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一饰剥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摧阅,春花似錦汰蓉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娇跟,卻和暖如春岩齿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苞俘。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工盹沈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吃谣。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓乞封,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親岗憋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肃晚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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