美文网首页
axios的二次封装

axios的二次封装

作者: 理想休想幻想 | 来源:发表于2019-02-28 21:44 被阅读0次

    在项目下新建一个service文件夹(与package.json同级),子文件:http.js 对axios请求头、拦截器等, reset.js:请求方法的封装,get,post等。
    axios的二次封装跟api的封装、或者在vuex的store中使用,
    axios的reset用于api封装用,提供api封装中使用,以及store中使用。

    1.http.js,axios请求头、拦截器等,

    import axios from 'axios'
    import { Message, MessageBox } from 'element-ui'
    import store from '../store'
    
    // 创建axios实例
    const service = axios.create({
      // baseURL: process.env.BASE_API, // api 的 base_url
      timeout: 5000 // 请求超时时间
    })
    
    // request拦截器
    service.interceptors.request.use(
      config => {
        if (store.getters.token) {
          config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        return config
      },
      error => {
        // Do something with request error
        console.log(error) // for debug
        Promise.reject(error)
      }
    )
    
    // response 拦截器
    service.interceptors.response.use(
      response => {
        /**
         * code为非20000是抛错 可结合自己业务进行修改
         */
        const res = response.data
        const codeReg = /^20\d+/
        if (!codeReg.test(response.status)) {
          Message({
            message: res.message,
            type: 'error',
            duration: 5 * 1000
          })
    
          // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
          if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
            MessageBox.confirm(
              '你已被登出,可以取消继续留在该页面,或者重新登录',
              '确定登出',
              {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning'
              }
            ).then(() => {
              store.dispatch('FedLogOut').then(() => {
                location.reload() // 为了重新实例化vue-router对象 避免bug
              })
            })
          }
          return Promise.reject('error')
        } else {
          return response.data
        }
      },
      error => {
        console.log('err' + error) // for debug
        Message({
          message: error.message,
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject(error)
      }
    )
    
    export default service
    
    

    2、reset.js,请求方法的封装,get,post等

    import http from './http.js'
    
    export default {
      post(url, data, config) {
        return http.post(url, data, config)
      },
    
      get(url, params, config) {
        const getConfig = {}
        if (params) {
          Object.assign(getConfig, {
            params
          })
        }
        if (config) Object.assign(getConfig, config)
    
        return http.get(url, getConfig)
      },
    
      put(url, data, config) {
        return http.put(url, data, config)
      },
    
      delete(url, params, config) {
        const delConfig = {}
        if (params) {
          Object.assign(delConfig, {
            params
          })
        }
        if (config) Object.assign(delConfig, config)
    
        return http.delete(url, delConfig)
      }
    }
    

    3.api封装使用:

    src/api/template.js:
     import request from '@/service/http.js' // axios的封装 后续添加axios二次封装
    
    //  /cosmopaas-dev为跨域规则 前面文章有提到
    // post方式传参用data
    export function getCommonList(query) {
      return request({
        url: '/cosmopaas-dev/algorithm/getAlgorithmModelPage',
        method: 'post',
        data: query
      })
    }
    

    4.store中使用:

    //在store的xxx.js中引入
    import api from '@/service/reset.js'
    
    export default {
      state: {
        tenants: [], // all tenants
      },
      getters: {
        tenants: state => state.tenants, //  all tenants
        clusters: state => state.clusters //  all clusters
      },
      mutations: {
        alertTenants: (state, data) => { // all tenants
          state.tenants = data
        },
        alertClusters: (state, data) => { // all tenants
          state.clusters = data
        }
      },
      actions: {
        // get all tenants
        getTenantsAPI: (context) => {
          api.get('/api/dce/tenants').then( res => {
            console.log(res.data)
            context.commit('alertTenants', res.data)
          }).catch( error => {
            console.log(error)
          })
        }
    }
    
    

    相关文章

      网友评论

          本文标题:axios的二次封装

          本文链接:https://www.haomeiwen.com/subject/pbhluqtx.html