封装axios

2019-12-25  本文已影响0人  青争小台
import Axios from 'axios'
import { Message } from 'element-ui'
import Auth from './auth' //是利用cookie插件,封装的操作cookie的方法
import { Loading } from 'element-ui'
import router from '@/router'

// 使用Element loading动画
let loading
function startLoading() {
  loading = Loading.service({
    lock: true,
    text: '加载中……',
    background: 'rgba(0, 0,0, 0.6)'
  })
}
function endLoading() {
  loading.close()
}

Axios.defaults.baseURL = process.env.VUE_APP_BASE_API// baseURL
Axios.defaults.timeout = 100000// 设置请求超时

// 请求拦截器
Axios.interceptors.request.use(config => {
  startLoading()// loading开启
  // 在每次请求之前判断cookie中是否存在token,若存在在每一个请求header上都加上token
  const token = Auth.getToken()
  if (token) {
    config.headers.Authorization = token
  }
  return config
}, error => {
  endLoading()// loading关闭
  return Promise.error(error)
})

// 响应拦截
Axios.interceptors.response.use(
  response => {
    endLoading()// loading关闭
    if (response.data.meta.status_code === 200) {
      return Promise.resolve(response)
    } else {
      switch (response.data.meta.status_code) {
        case 420:
          Message({
            message: '用户名或密码错误',
            type: 'error',
            duration: 5 * 1000
          })
          break
        case 403:
          Message({
            message: '请重新登录',
            type: 'error',
            duration: 5 * 1000
          })
          Auth.removeToken()
          localStorage.removeItem('vuex')
          localStorage.removeItem('admins_info')
          router.push(`/login`)
          break
        // 其他错误,直接抛出错误提示
        default:
          Message({
            message: response.data.error || response.data.meta.message,
            type: 'error',
            duration: 5 * 1000
          })
      }
      return Promise.reject(response)
    }
  }, error => {
    endLoading()// loading关闭
    return Promise.reject(error)
  }
)

/**
 * get方法,对应get请求
 * @param {String} url 请求的url地址
 * @param {Object} params 请求时携带的参数
 */
export function get(url, params) {
  return new Promise((resolve, reject) => {
    Axios.get(url, {
      params: params
    }).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err.data)
    })
  }).catch((err) => {
    console.log('catch-err', err)
  })
}

/**
 * post方法,对应post请求
 * @param {String} url 请求的URL地址
 * @param {Object} params 请求时携带的参数
 */
export function post(url, params) {
  return new Promise((resolve, reject) => {
    Axios.post(url, params)
      .then(res => {
        resolve(res.data)
      }).catch(err => {
        reject(err.data)
      })
  }).catch((err) => {
    console.log('catch-err', err)
  })
}

auth.js

import Cookies from 'js-cookie'

const KEY = 'te_token'
const authToken = {
//获取cookie
  getToken: function() {
    return Cookies.get(KEY)
  },
//设置cookie
  setToken: function(token) {
    Cookies.set(KEY, token)
  },
//移除cookie
  removeToken: function() {
    Cookies.remove(KEY)
  }
}
export default authToken

详情见:https://www.cnblogs.com/chaoyuehedy/p/9931146.html
其他参考文章:https://www.html.cn/qa/react/14268.html
https://www.jianshu.com/p/e59aa71e1840
https://blog.csdn.net/chf1142152101/article/details/107099403/

上一篇下一篇

猜你喜欢

热点阅读