• axios 封装【满足常规数据上传及file上传】


    axios 封装【满足常规数据上传及file上传】

    • request.js

    /* 封装axios */
    const axios = require('axios');
    
    import {
        featchApiHeader,
        formApiHeader,
        baseApiUrl
    } from './requestUtil.js';
    
    const {
        Loading,
        Message
    } = require('element-ui');
    
    import router from '@/routes/routes'
    import store from '@/store/store'
    import qs from 'qs'
    
    let loadingInstance = null; //loading实例
    
    /* 创建实例时的基础默认配置,可以在请求时进行重写覆盖 */
    const instance = axios.create({
        baseURL: baseApiUrl,
        timeout: 5000,
        method: 'post',
        headers: featchApiHeader
    })
    
    /* 拦截器 */
    /**
     * @Description: 
     * - 在request 内通过对data类型的校验,区分是一般的post还是formdata文件上传
     * - 根据类型的不同改变成不同的headers
     * - 
     */
    instance.interceptors.request.use(
        config => {
            loadingInstance = Loading.service({
                text: "请求中...",
                spinner: 'el-icon-loading'
            });
            if (config.method.toLowerCase() == "post") {
                let newdata = config.data;
                if (config.data instanceof FormData) { //文件类,文件类不需要stringify
                    Object.assign(config.headers, formApiHeader); //修改`Content-Type`
                    newdata.append("accessStr", localStorage.getItem("apiToken") || '')
                } else { //非文件类,stringify
                    //空处理
                    newdata = (typeof newdata == 'object' && Object.keys(newdata).length >= 0) ? newdata : {};
    
                    newdata = {
                        ...newdata,
                        accessStr: localStorage.getItem("apiToken") || ''
                    }
                    newdata = qs.stringify(newdata);
                }
                config.data = newdata;
            }
            return config
        },
        error => {
            loadingInstance.close();
            Message({
                showClose: true,
                message: '请求错误,请您稍后重试!',
                type: 'error'
            });
            return Promise.reject(error)
        },
    )
    
    instance.interceptors.response.use(
        response => {
            loadingInstance.close();
            let resStatus = response.status;
            if (resStatus == 200) {
                return Promise.resolve(response)
            } else {
                return Promise.reject(response)
            }
        },
        error => {
            loadingInstance.close();
            if (error.response.status) {
                switch (error.response.status) {
                    case 401: //未登录,从哪里来回哪里去
                        router.replace({
                            path: '/index',
                            query: {
                                redirect: router.currentRoute.fullPath
                            }
                        });
                        break;
                    case 403: //token过期
                        Message({
                            message: '登录过期,请重新登录',
                            duration: 1500
                        });
                        localStorage.removeItem("apiToken"); //清除token
                        store.commit("loginSuccess", ""); //全局通知loginSuccess为空
                        break;
                    case 404:
                        Message({
                            message: '网络请求不存在',
                            duration: 1500
                        });
                        break;
                    case 500, 501, 503: //服务端错误
                        Message({
                            message: '请求异常,请您稍后重试!',
                            duration: 1500
                        });
                        break;
                    default:
                        Message({
                            message: error.response.data.message,
                            duration: 1500
                        });
                        break;
                }
                return Promise.reject(error)
            }
    
        },
    )
    
    export default instance
    

    • requestUtil.js

    /**
     * @Description: 
     * - 处理请求头,
     * - apitoken、针对一般的post和文件上传,设置不同的headers
     * - 根据环境获取不同的baseUrl
     */
    
    const getApitoken = () => {
        return localStorage.getItem("apiToken") || '' //在登录时得到后存储起来
    }
    
    const commmonHeader = {
        'Accept': 'application/json',
        'Authorization': `Bearer ${getApitoken()}`
    }
    
    /* 常规的 */
    export const featchApiHeader = {...commmonHeader,
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    
    /* 文件的 */
    export const formApiHeader ={...commmonHeader, 
        'Content-Type': 'multipart/form-data'
    }
    
    export const baseApiUrl = process.env.VUE_APP_API_BASEURL
    
    
  • 相关阅读:
    django wsgi nginx 配置
    supervisor error: <class 'socket.error'>, [Errno 110]
    gunicorn 启动无日志
    获取windows 网卡GUID和ip信息
    亚马逊EC2根硬盘空间扩容
    pypcap 安装
    mysql 1709: Index column size too large. The maximum column size is 767 bytes.
    mysql死锁检查
    D3.js画思维导图(转)
    用D3.js画树状图
  • 原文地址:https://www.cnblogs.com/yogic/p/13651790.html
Copyright © 2020-2023  润新知