Axios

Vue实践 axios封装

2019-04-14  本文已影响142人  Nicholas_liang

1.1 axios二次封装

import axios from 'axios'

import router from '../router'

import {MessageBox, Message} from 'element-ui'

let loginUrl = '/login'

// 根据环境切换接口地址

axios.defaults.baseURL = process.env.VUE_APP_API

axios.defaults.headers = {'X-Requested-With': 'XMLHttpRequest'}

axios.defaults.timeout = 60000

// 请求拦截器

axios.interceptors.request.use(

  config => {

    if (router.history.current.path !== loginUrl) {

      let token = window.sessionStorage.getItem('token')

      if (token == null) {

        router.replace({path: loginUrl, query: {redirect: router.currentRoute.fullPath}})

        return false

      } else {

        config.headers['Authorization'] = 'JWT ' + token

      }

    }

    return config

  }, error => {

    Message.warning(error)

    return Promise.reject(error)

  })


紧接着的是响应拦截器(即异常处理)

axios.interceptors.response.use(

  response => {

    return response.data

  }, error => {

    if (error.response !== undefined) {

      switch (error.response.status) {

        case 400:

          MessageBox.alert(error.response.data)

          break

        case 401:

          if (window.sessionStorage.getItem('out') === null) {

            window.sessionStorage.setItem('out', 1)

            MessageBox.confirm('会话已失效! 请重新登录', '提示', {confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning'}).then(() => {

              router.replace({path: loginUrl, query: {redirect: router.currentRoute.fullPath}})

            }).catch(action => {

              window.sessionStorage.clear()

              window.localStorage.clear()

            })

          }

          break

        case 402:

          MessageBox.confirm('登陆超时 !', '提示', {confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning'}).then(() => {

            router.replace({path: loginUrl, query: {redirect: router.currentRoute.fullPath}})

          })

          break

        case 403:

          MessageBox.alert('没有权限!')

          break

        // ...忽略

        default:

          MessageBox.alert(`连接错误${error.response.status}`)

    }

    return Promise.resolve(error.response)

  }

  return Promise.resolve(error)

})


最后是导出基础请求类型封装。

export default {

  get (url, param) {

    if (param !== undefined) {

      Object.assign(param, {_t: (new Date()).getTime()})

    } else {

      param = {_t: (new Date()).getTime()}

    }

    return axios({method: 'get', url, params: param})

  },

  // 不常更新的数据用这个

  getData (url, param) {

    return axios({method: 'get', url, params: param})

  },

  post (url, param, config) {

    return axios.post(url, param, config)

  },

  put: axios.put,

  _delete: axios.delete

}


其中给get请求加上时间戳参数,避免从缓存中拿数据。 除了基础请求类型,还有很多类似下载、上传这种,需要特殊的的请求头,此时可以根据自身需求进行封装。

上一篇下一篇

猜你喜欢

热点阅读