继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

基于vue的axios封装

慕姐8265434
关注TA
已关注
手记 1309
粉丝 222
获赞 1065

已经开发了几个vue项目,然后对 axios的封装 不断优化。现在我用起来也比较方便。

主要特点:
  • 超时处理

  • 统一http状态码 处理

  • 统一错误处理

  • 鉴权等

页面构成

webp

页面构成.png

axios配置

需要 npm axios 和 store2

import axios from 'axios';import store2 from 'store2'    //一个localStorage和sessionStorage 处理模块// import qs from 'qs';axios.defaults.baseURL =  'http://10.10.80.126:8081',   //开发ip// axios.defaults.baseURL =  'http://45.105.126.130',   //测试ipaxios.defaults.timeout =  6000;     //超时时间axios.defaults.headers =  {    'Content-Type': 'application/json'};
axios.defaults.retry = 4;   //超时 全局的请求次数 再重新请求4次,也就是最多请求5次axios.defaults.retryDelay = 500;   //超时 请求的间隔时间(比如超时后,下一次请求时间就是 超时时间 加上 超时请求间隔时间)axios.interceptors.request.use(config => {    //(loding动画)开始
    //我们采用token验证,所以在这里统一 给header 添加token
    const token = store2.session('token');    if(token){
        config.headers.Authorization = token.accessToken;
    }    return config
}, error => {    return Promise.reject(error)
})

axios.interceptors.response.use(response => {    //(loding动画)结束
    return response
}, error => {    //里面处理 超时请求
    var config = error.config;    console.log(config)    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(error);    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {        // Reject with the error
        alert('服务器请求超时,请检出网络,或联系客服')        return Promise.reject(error);
    }    // Increase the retry count
    config.__retryCount += 1;    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {        return axios(config);
    });
})export default axios;
请求、错误处理 ,作为插件使用
import axios from "./axios";//根据httpcode 状态码处理错误function checkStatus (res) {    switch (res.status)
    {        case 200 :{
            alert(200)            return res            break;
        }        case 403 :{
            alert('403');//我们后台 是处理登录过期
            return false
            break;
        }        case 500 :{
            alert('500');//处理500错误
            return false
            break;
        }        default:            return false
            break;
    }
}//统一处理 接口错误function checkCode (res) {    console.log(res)    if(res){        if(res.data.response.success){  //res.data.data.success 这里是我们后端数据是这样
            return res
        }else {
            alert('具体接口错误'); //比如:登录密码错误等,所有接口错误 都在这里处理了
            return false
        }
    }else {        return false
    }

}// 处理请求的差异,比如表单数据序列化,get,post 请求头是否一样 等function formatDate(method = 'GET', params) {    switch (method) {        case 'POST':            return {
                method,                data: params
            }        case 'PUT':            return {
                method,                data: params
            }        case 'DELETE':            return {
                method
            }        case 'GET':            return {
                method,
                params
            }        default:            return {
                method,
                params
            }
    }
}const api = {    // 轮播图   Object.assign 是合并对象,也就是axios的配置
    getCarouselList(params) {        return axios(Object.assign(formatDate('GET', params), {            url: `/carousel/1`
        })).then(checkStatus).then(checkCode)
    },    //登录
    login(params){        return axios(Object.assign(formatDate('POST', params), {            url: `/login`
        })).then(checkStatus).then(checkCode)
    }
}//定义插件export default {    install: function(Vue, Option) {        Object.defineProperty(Vue.prototype, "$http", { value: api });
    }
};
main.js应用
import api from './axios/api'Vue.use(api)
页面使用
//这里是在api.js定义的插件this.$http.getCarouselList().then(data => {  if(data){    //处理数据
  }
})



作者:xilong
链接:https://www.jianshu.com/p/7387a28a7e6f


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP