vue中axios的二次分装

253 阅读2分钟

为了方便我们在vue中对axios的操作,我们通常对axios进行二次分装

  • http.interceptors.request.use 里面设置请求头(token)
  • http.interceptors.response.use 里面是对返回的数据进行操作

首先我们需要安装axios

安装

使用npm:

   $ npm install axios 

使用bower

$ bower install axios 

使用cdn:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script> 

二次分装axios

首先在src目录下创建utils/http.js,然后在http.js中配置

import axios from "axios";
const http = axios.create({
    baseURL: '',
    timeout: 10000,
});
// 添加请求拦截器
http.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});
// 添加响应拦截器
http.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    const { data } = response
    return data;
}, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
});

export default http

接口管理

在src目录下创建api/index.js

  • url :接口地址
  • method :请求方法
  • data :请求参数
import axios from "@/utils/http.js";

// 例如登录接口
export function Login(data) {
    return axios({
        method: 'post',
        url: '',
        data
    })
}

调用的话,在页面中先引入

import { Login } from "@/api";

请求超时的处理(没要求可不用写,只需在你之前写好的代码修改)

import axios from "axios";
const http = axios.create({
    baseURL: '',
    timeout: 10000,
});
const http = axios.create({
    baseURL: '',
    timeout: 50,
});
// 添加请求拦截器
http.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
http.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    const { data } = response
    return data;
}, function (error) {
    // 如果请求超时看看打印出啥
    console.dir(error)
    // 并且判断
    if(error.code==='ECONNABORTED'&&error.message.includes('timeout')){
        // 这里可以不用打印,看需求
        console.log('请求超时')
    }
    // 对响应错误做点什么
    return Promise.reject(error);
});

export default http

取消重复请求(没要求可不写,只需要在你之前写好的代码修改)

import axios from "axios";
const http = axios.create({
    baseURL: '',
    timeout: 10000,
});
const pending = []
const removePending = (config) => {
    let pendIndex = pending.forEach(v => {
        if (v.url === config.url
            && v.method == config.method
            && JSON.stringify(v.params) === JSON.stringify(config.params)
            && JSON.stringify(v.body) === JSON.stringify(config.body)
        ) {
            // 取消请求
            v.controller.abort()
            return true
        }
        return false
    })

    if (pendIndex >= 0) {
        pending.splice(pendIndex, 1);
    }
}
// 添加请求拦截器
http.interceptors.request.use(function (config) {
    removePending(config)
    const controller = new AbortController();
    config.signal = controller.signal;
    config.controller = controller;
    pending.push({ ...config })
    
    // 在发送请求之前做些什么
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

export default http