Axios 简易封装

95 阅读1分钟

Axios 封装

axios 封装

import axios from 'axios';
import Qs from 'qs'; //路由工具库
import { GLOBAL } from './config'; //全局配置单例
import {
    getToken,
    getRemoteAddress
} from './utils'; //工具函数
const baseURL = process.env.BASE_API,
axios.default.timeout = 60 * 1000; //请求等待一分钟 
axios.defaults.withCredentials = true; //是否允许传token,存在跨域问题
axios.interceptors.request.use((config) => {
    //添加一些配置,或给headers塞入一些配置
    return config;
}, error => {
    //对错误请求拦截
});
axios.interceptors.response.use((response) => {
    const {data: res} = response;
    if(res.code != 200) {
        //错误处理,单点登录跳转等
    }
    return response
}, err => {
    //对响应错误的统一处理
    return Promise.reject(err);
});
const dealWithParams: (params) => {
    let res = params;
    for(let item in resParams) {
        if(res[item] === '' || res[item] == null) {
            delete res[item];
        }
    }
    return res || {};
}
const getParamConfigUrl = (params, isEncode = false) => {
    if(!params || Object.keys(params).length = 0) return '';
    let requestBodyStr = '';
    const paramObject = dealWithParams(params);
    Object.keys(paramObject).forEach((key, index) => {
        requestBodyStr = requestBodyStr.concat(`${index > 0 ? '&' : ''}${key}=${paramObject[key]}`);
    });
    return isEncode ? `?${requestBodyStr}` : encodeURI(`?${requestBodyStr}`)
}
const contentType = {
    'form-file': 'multipart/form-data',
    'from-common': 'application/x-www-from-urlencoded',
    'json': 'application/json;charset=UTF-8'
 }
 
 export default requestAPI = {
     success_resp: (response, successCallback, errorCallback) => {
         //...
     }
     error_resp: (err, errorCallback) => {
         //...
     }
     get: ({url, params, successCallback, errorCallback, needRmote, stateConfig}) => {
         let ajaxParams = dealWithParams(params)
         const headers = {
             'Content-Type': contentType['json'],
         }
         return axios({
             method: 'get',
             url: `${needRemote ? '前缀' : '另外的配置'}`,
             params: ajaxParams,
             headers: headers
         }).then((response) => {
             return requestAPI.success_resp(response, successCallback, errorCallback )
         }, (error) => {
             return requestAPI.error_resp(error, errorCallback);
         }) 
     }
     post: ({url, params, successCallback, errorCallback, contentType, needRmote, stateConfig}) {
         //...
     }
     delete:({url, params, successCallback, errorCallback, contentData,needRmote, stateConfig}) {
         //...
     }
     put:({url, params, successCallback, errorCallback, contentType , needRmote, stateConfig}) {
         //...
     }
     download: ({url, params, successCallback, errorCallback, needRmote, stateConfig}) => {
         let ajaxParams = Qs.stringify(dealWithParams(params));
         const headers = {
             'Content-Type': contentType['json'],
         }
         return axios({
             method: 'get',
             url: `${needRemote ? '前缀' : '另外的配置'}${url}?${ajaxParams}`,
             responseType: 'blob',
             headers: headers
         }).then((response) => {
             return requestAPI.success_resp(response, successCallback, errorCallback)
         }, (error) => {
             return requestAPI.error_resp(error, errorCallback);
         })
     }
     blobDownloadFile = ({data, fileName, isBrowserDownload = true}) => {
         if(! data) return ;
         let url = ''
         if(isBrowserDownload && typeof data === 'string') {
             url = data;
         }else {
             url = window.URL.createObjectURL(data);
         }
         return new Promise((reslove, reject) => {
           try {
             let link = document.createElement('a');
             link.style.display = 'none';
             link.href = url;
             link.setAttribute('download', fileName)
             document.body.appendChild(link);
             link.click();
           } catch (err) {
               reject(err);
           }
             URL.revokeObjectURL(link.href);
             document.body.removeChild(link);
             resolve();
          })
     }
 }