axios请求方法二次封装

requestMessage.js

/**
  * @Descripttion: axios和操作提示的二次封装
  * @Author: lgen
*/
  
import Vue from 'vue'
import axios from 'axios'

/* 页面顶部弹出提示
 * @method showMsg
 * @param {String} text 提示的文字
 * @param {Number} icon 状态图标,1成功,2警告,3消息,4错误
 * @param {Number} duration 显示时间,毫秒,设为 0 则不会自动关闭
*/
const showMsg=(text,icon,duration)=>{
    let typeText=''
    switch(icon){
        case 1:
            typeText='success';
            break;
        case 2:
            typeText='warning';
            break;
        case 3:
            typeText='';
            break;
        default:
            typeText='error';
    }

    Vue.prototype.$message({
        message:text,
        type:typeText,
        duration:duration?duration:1000
    });
}

 /* 删除对象中的空值
 * @method deleteObjNull
 * @param {Object} obj 需要处理的对象
*/
const deleteObjNull=(obj)=>{
    for(let key in obj){
        if(obj[key]==='' || obj[key]===undefined || obj[key]===null){
            delete obj[key];
        }
    }
}

// 加载动画
let loading;
const openFullScreen=()=>{
    loading = Vue.prototype.$loading({
      lock: true,
      text: '加载中...',
      target:'.loadingBox', //Loading 需要覆盖的 DOM 节点
      spinner: 'el-icon-loading',
      background: 'rgba(255, 255, 255, 0.5)'
    });
}

//清除动画
const endLoading=()=>{
    loading.close();
}

// 请求配置
const instance=axios.create({
    timeout: 60000, //指定请求超时的毫秒数(0 表示无超时时间)
})

// 添加请求拦截器
instance.interceptors.request.use(config=>{
    // 在发送请求之前
    if(loading){
        // 如果存在动画,则先清除再执行新的动画
        endLoading(); //动画结束
    }
    openFullScreen(); //加载动画

    // 处理打包之后请求代理404错误
    if(config.url.includes('/other')){
        //接口1
        config.url=process.env.VUE_APP_OTHER+config.url.replace('/aa','');
    }else if(config.url.includes('/mall')){
        //接口2
        config.url=process.env.VUE_APP_MALL+config.url.replace('/bb','');
    }else if(config.url.includes('/design')){
        //接口3
        config.url=process.env.VUE_APP_DESIGN+config.url.replace('/cc','');
    }

    return config;
},error=>{
    // 请求出错
    setTimeout(() => {
        endLoading(); //动画结束
        showMsg('加载超时');
     },3000)

    return Promise.reject(error);
})

// 添加响应拦截器
instance.interceptors.response.use(response=>{
    endLoading(); //动画结束
    return response;
},error=>{
    // 响应出错
    setTimeout(() => {
        endLoading(); //动画结束
        showMsg('请求失败');
      },1000)

    return Promise.reject(error);
})

/* 统一axios请求方法的格式
 * @method axiosRequest
 * @param {String} url 请求的地址
 * @param {Object} data 请求参数
 * @param {Boolean} isForm 是否表单数据,含有文件上传
 * @param {String} type 请求类型
 * @return {Object} promise对象
*/
const axiosRequest=async (url='',data={},isForm=false,type='POST')=>{
    let result; //请求的返回值
    type = type.toUpperCase();
    deleteObjNull(data); // 删除请求参数中的空值

    // 如果是表单数据,进行处理
    if(isForm){
        let form=new FormData()
        Object.keys(data).forEach(key=>{
            form.append(key,data[key])
        })
        data=form
    }else{
        data=JSON.stringify(data)
    }

    // 请求配置
    let requestOptions={
        method:type,
        url:url,
        headers:{
            'Content-type':isForm ? 'multipart/form-data' : 'application/json'
        },
        params:type==='GET'?data:'',
        data:type!=='GET'?data:''
    }

    // 请求实例
    await instance(requestOptions).then(res=>{
        result=res;
    })
    return result;
}

export {
	showMsg,
	axiosRequest
}
axios是一个基于Promise的HTTP客户端,可以用于发送HTTP请求二次封装axios可以方便地在项目中统一处理请求的错误、loading状态等,提高代码的复用性。以下是一个简单的axios请求二次封装示例: ```javascript import axios from 'axios'; // 创建一个axios实例 const instance = axios.create({ baseURL: 'https://api.example.com', // 设置接口的基础url timeout: 5000, // 请求超时时间 }); // 请求拦截器 instance.interceptors.request.use( config => { // 在请求发送之前做一些处理,例如添加token到请求头部 // config.headers['Authorization'] = getToken(); return config; }, error => { // 错误处理 return Promise.reject(error); } ); // 响应拦截器 instance.interceptors.response.use( response => { // 对响应数据做一些处理,例如解析返回的数据 // const res = response.data; return response.data; }, error => { // 错误处理 return Promise.reject(error); } ); export default instance; ``` 在上述代码中,我们首先使用`axios.create`创建了一个axios实例,并配置了一些默认的请求参数,如`baseURL`和`timeout`。然后我们通过`instance.interceptors.request.use`和`instance.interceptors.response.use`来添加请求拦截器和响应拦截器。 请求拦截器可以在发送请求之前对请求进行一些处理,例如添加token到请求头部。响应拦截器可以对返回的数据进行一些处理,例如解析返回的数据。在拦截器中,我们可以根据具体的业务需求来进行拦截和处理。 最后,我们将封装好的axios实例导出,供其他地方使用。其他地方只需引入该实例,即可发送请求并统一处理错误、loading等逻辑。例如: ```javascript import request from './request'; // 发送GET请求 request.get('/api/getData', { params: { id: 1 } }).then(res => { // 处理返回的数据 }).catch(error => { // 处理错误 }); // 发送POST请求 request.post('/api/saveData', { data: { name: 'John' } }).then(res => { // 处理返回的数据 }).catch(error => { // 处理错误 }); ``` 通过这种二次封装的方式,我们可以在项目中更方便地使用axios发送请求,并统一处理错误和loading状态,提高代码的复用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值