• Vue-admin工作整理(十六):Ajax-axios进行请求封装+拦截器


    典型的工具类封装,增加拦截起来做相应的处理

    user.js:

    import axios from './index'
    
    export const getUserInfo = ({ userId }) => {
      return axios.request({
        url: '/getUserInfo',
        method: 'post',
        data: { // POST参数的请求是需要放在data里的
          userId
        }
      })
    }

    axios.js 工具类:

    import axios from 'axios'
    import { baseURL } from '@/config'
    // 以类的形式来进行封装,使用es6的class
    class HttpRequest {
      constructor (baseUrl = baseURL) { // 每个类必须的方法,在这个方法中,可以默认接收一些参数:options(参数对象),
        // 该定义为:传入一个baseUrl参数,当没有这个参数的时候直接取配置内的baseURL数据进行赋值,这种写法为es6的写法
        this.baseUrl = baseUrl // 当使用new HttpRequest的时候,this.baseUrl会将baseUrl返给变量
        this.queue = {} // 设置一个队列(空对象),以队列形式管理请求
      }
      // 在内容设置一个全局的配置,使用方法来实现,通过该方法,来返回一个内部的配置
      getInsideConfig () {
        const config = {
          baseUrl: this.baseUrl,
          headers: {
            //
          }
        }
        return config
      }
      // 全局拦截器
      interceptors (instance, url) { // 请求拦截器
        instance.interceptors.request.use(config => {
          // 添加一个请求前的控制,比如这里添加一个全局的loading...
          // Spin.show() // Spin为一个加载中的组件,通过该方法可以控制该组件的显示,此时的页面是不允许点击的,此时多有的组件都会调用这个来进行显示
          if (!Object.keys(this.queue).length) {
            // Spin.show() // 通过Object.keys获取队列的所有属性名,如果没有请求,那么就调用一个全局的loading组件
          }
          this.queue[url] = true // 把url作为一个属性值来传入
          console.log(config)
          return config // 将请求return出去,请求才会继续。
        }, error => { // 当请求出现错误的时候的处理,会提供一个错误信息
          return Promise.reject(error) // 将错误信息返回
        })
        // 定义一个响应拦截器,就是调了接口之后服务端给出响应返回的东西,此时就通过这个方法进行拦截
        instance.interceptors.response.use(res => { // 第一个回调函数,就是服务端返回的内容
          console.log(res)
          delete this.queue[url] // 如果成功响应,那么我就把队列里的对应的数据删掉
          const { data, status } = res // 响应返回内容做一个筛选,提取我们想要使用的两个数据
          return { data, status } // 将请求return出去,请求才会继续,只返回我们想要的数据。
        }, error => { // 第二个函数,用来获取错误信息
          delete this.queue[url] // 如果失败了,也需要把队列里该数据删掉
          return Promise.reject(error) // 将错误信息返回
        })
      }
      request (options) { // 定义完constructor之后,用request来创建一个请求,以参数方式插入一个配置,在使用的时候就是一个实例,调用request方法,插入一个配置
        const instance = axios.create() // 使用axios的create方法创建一个实例,它是一个函数,我们给它传入一个配置
        options = Object.assign(this.getInsideConfig(), options) // es6的方法,通过Object.assign方法将两个对象里
        // 的属性合并成一个对象中去,如果两个对象存在相同的属性,那么取后面的值,所以要把请求的时候传入的配置放在后面,来覆盖全局的配置
        this.interceptors(instance, options.url) // 给实例添加拦截器
        return instance(options)
      }
    }
    
    export default HttpRequest
  • 相关阅读:
    vue-面试
    使用webpack4搭建一个基于Vue的组件库
    vue 仿今日头条
    如何正确的在项目中接入微信JS-SDK
    vuejs实现折叠面板展开收缩动画
    Vue的watch和computed属性
    Android Studio(十):添加assets目录
    Android Studio(九):引用jar及so文件
    Android Studio(八):Android Studio设置教程
    Android Studio(七):项目从Eclipse到Android Studio迁移
  • 原文地址:https://www.cnblogs.com/cristin/p/9642810.html
Copyright © 2020-2023  润新知