• vue中axios的二次封装


    我们做项目时,虽然axios也可以直接拿来用,但是对接口比较零散,不太好进行维护,也会产生大量的重复代码,所以我在这对axios进行了统一接口处理

    第一步,先在src中的公共文件夹中如utils里新建request.js文件

    import axios from 'axios'
    import router from '@/router/routers'
    import { Notification, MessageBox } from 'element-ui'
    import store from '../store'
    import { getToken } from '@/utils/auth'
    import Config from '@/config'
    
    import {baseUrl} from '@/utils/env'
    
    // 创建axios实例
    const service = axios.create({
      baseURL: baseUrl, // api 的 base_url
      // baseURL: process.env.BASE_API, // api 的 base_url
      timeout: Config.timeout // 请求超时时间
    })
    
    // request拦截器
    service.interceptors.request.use(
      config => {
        if (getToken()) {
          config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        config.headers['Content-Type'] = 'application/json'
        return config
      },
      error => {
        // Do something with request error
        console.log(error) // for debug
        Promise.reject(error)
      }
    )
    
    // response 拦截器
    service.interceptors.response.use(
      response => {
        const code = response.status
        console.log(response)
        if (code < 200 || code > 300) {
          Notification.error({
            title: response.message
          })
          return Promise.reject('error')
        } else {
          return response.data
        }
      },
      error => {
        let code = 0
        try {
          code = error.response.data.status
        } catch (e) {
          if (error.toString().indexOf('Error: timeout') !== -1) {
            Notification.error({
              title: '网络请求超时',
              duration: 2500
            })
            return Promise.reject(error)
          }
          if (error.toString().indexOf('Error: Network Error') !== -1) {
            Notification.error({
              title: '网络请求错误',
              duration: 2500
            })
            return Promise.reject(error)
          }
        }
        if (code === 401) {
          MessageBox.confirm(
            '登录状态已过期,您可以继续留在该页面,或者重新登录',
            '系统提示',
            {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning'
            }
          ).then(() => {
            store.dispatch('LogOut').then(() => {
              location.reload() // 为了重新实例化vue-router对象 避免bug
            })
          })
        } else if (code === 403) {
          router.push({ path: '/401' })
        } else {
          const errorMsg = error.response.data.message
          if (errorMsg !== undefined) {
            Notification.error({
              title: errorMsg,
              duration: 2500
            })
          }
        }
        return Promise.reject(error)
      }
    )
    export default service
    

      代码解读:

     

    将接口统一放到单独的文件中如我的

    引入request.js

    第三步,

    在页面使用

    好了,这就是axios的二次封装

  • 相关阅读:
    Qt::oracle数据库windows驱动编译
    Qt::pgsql数据库windows驱动编译
    SSMS先安装了英文版,然后卸载后,安装中文版,语言还是英文
    centos 7.5 编译安装nginx
    远程登录linux(centOS)中的MySQL
    MySQL复制从库记录主从信息的参数小结
    系统服务自动重启方案
    IDEA背景界面护眼色设置豆沙绿(中文版图解)
    一份简单够用的 Nginx Location 配置讲解
    堆和堆傻傻分不清?一文告诉你 Java 集合中「堆」的最佳打开方式
  • 原文地址:https://www.cnblogs.com/WangXinPeng/p/11670601.html
Copyright © 2020-2023  润新知