基于axios封装http请求

84 阅读1分钟
import axios from 'axios'
import {message} from 'antd';
import {API_URL} from '../utils/urlHead'
import md5 from 'js-md5'
import Func from '../utils/common'

axios.defaults.withCredentials = true;       // 允许携带cookie
//缓存接口请求 有效时间内共用返回数据。
let cacheEffectTime = 1000;
let cache = new Proxy({},{
  set(target, p,value) {
    target[p] = value;
    setTimeout(()=>{
      delete target[p];
    },cacheEffectTime);
    return true
  },
  get: function(target, key, receiver){
    return target[key];
  }
})


function axiosRequest(url, method, params) {
  let paramsToken = url;
  if (params&&!Func.isEmptyObject(params)){
    paramsToken = paramsToken + JSON.stringify(params)
    paramsToken = md5(paramsToken)
  }
  if(paramsToken&&cache[paramsToken]){//缓存命中
    return cache[paramsToken]
  } else {
    const headers = {
      paramsToken
    };
    // 项目内接口调用时将projectId放到header里
    if(sessionStorage.getItem('xxx')){
      headers.xxx = sessionStorage.getItem('xxx');
    }

    let res = new Promise((resolve, reject) => {
      axios({
        method: method,
        url: url,
        params: method && method.toLowerCase() === 'get' && params,
        data: params,
        headers: headers
      }).then(res => {
        // 这里我们和后端约定当返回的状态码为200的时候ok
        if (parseInt(res.data.code) === 200) {
          resolve(res.data)
        } else {
          if (res.data.code == -100) {
            if (API_URL === 'http://localhost:8091') {
              //
            } else {
              // top.location.href = '/logout'
              // window.location.reload()

            }
          } else {
            const code = res.data.code || res.status;
            const errorMsg = res.data.msg || res.data.message || res.error;
            message.error(`错误代码${code}: ${errorMsg}`, 5)
            if(res.status == 207){
              resolve(res.data);
            }
          }
          reject(res.data?.code || res.status);
        }
      }).catch(err => {
        if(err.response.status === 401){//没有权限 未登录
          top.location.href = '/xxx'
        }
        reject(err)
      })
    })
    cache[paramsToken] = res;
    return res
  }
}

export default axiosRequest