安装和配置

安装

使用 npm:

npm install axios

配置拦截器

在Vue项目中,可以创建一个utils文件夹,然后在里面创建一个request.js文件,用于封装axios的请求拦截器和响应拦截器。

// 在src/utils/request.js中
import axios from 'axios'
import { Message } from 'element-ui'
// 引入store
import store from '@/store'
// 引入获取token的方法
import { getToken } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API + '/api',
  timeout: 5000
})

// 请求拦截器
service.interceptors.request.use(config => {
  // 如果有token,就携带token
  if (store.getters.token) {
    config.headers['Authorization'] = getToken()
  }
  return config
},error => {
  console.log(error)
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(response => {
  // 获取响应数据
  const res = response.data
  // 放行文件流
  if (response.headers['content-type'] === 'application/vnd.openxmlformats') {
    return res
  }
  // 如果响应数据的code不是20000,就提示错误
  if (res.code !== 20000) {
    Message({
      message: res.msg || 'Error',
      type: 'error',
      duration: 5 * 1000
    })
    
    // 如果响应数据的code是50008或者50012或者50014,就说明token过期或者非法,就重新登录
    if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
      // 重新登陆
      MessageBox.confirm('您已被注销,您可以取消以停留在此页面,或者重新登录', '确认注销', {
        confirmButtonText: '重新登陆',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 清除token
        store.dispatch('user/resetToken').then(() => {
          // 重新加载页面
          location.reload()
        })
      })
    }
    return Promise.reject(new Error(res.msg || 'Error'))
  } else {
    return res
  }
}, error => {
  console.log('err' + error) // for debug
  Message({
    message: error.message,
    type: 'error',
    duration: 5 * 1000
  })
  return Promise.reject(error)
})

// 导出service
export default service

其中,utils/auth.js文件中的getToken方法如下:

// 在src/utils/auth.js中
const TokenKey = 'vue_admin_template_token'

export function getToken() {
  return localStorage.getItem(TokenKey)
}

export function setToken(token) {
  return localStorage.setItem(TokenKey, token)
}

export function removeToken() {
  return localStorage.removeItem(TokenKey)
}

api集中管理

在src/api文件夹中,创建一个index.js文件,用于集中管理api。

// 在src/api/index.md.js中
import request from '@/utils/request'
const BASE_API = '/class'

// 默认导出
export default {
   // 获取班级列表
  getClassList() {
    return request({
      url: `${BASE_API}/getClassList`,
      method: 'get'
    })
  }
}

// 分别导出
export function getClassList() {
  return request({
    url: `${BASE_API}/getClassList`,
    method: 'get'
  })
}

使用

在组件中使用api:

// 在src/views/class/index.md.vue中

// 默认导出引入
import api from '@/api'

// 分别导出引入
import { getClassList } from '@/api'
// 或者
import * as api from '@/api'

export default {
  data() {
    return {
      classList: []
    }
  },
  methods: {
    // 获取班级列表
    async getClassList() {
      const res = await api.getClassList()
      this.classList = res.data
    }
  },
  created() {
    this.getClassList()
  }
}
Last Updated:
Contributors: 黄定鑫