axios二次封装请求拦截和响应拦截

创建axios实例

import axios from 'axios'
// 创建axios实例对象,添加全局配置
const service = axios.create({
    baseURL: config.baseApi,
    timeout: 8000
})

请求拦截  --统一所有请求携带token

// 请求拦截
service.interceptors.request.use((req) => {
    const headers = req.headers;
    const userInfo = storage.getItem('userInfo') || {}; //该处时引入的其他模块,方便获取                                                     
                                                        //token,可自行封装
    const { token = "" } = userInfo
    if (!token) headers.Authorization = 'Bearer ' + token; //如果token存在则设置请求头字段
    return req;
})

响应拦截 

// 响应拦截
service.interceptors.response.use((res) => {
    //响应状态码为200时进入
    const { errorCode, data, errorMessage } = res.data;
    if (errorCode === 0) {
        return res.data;
    } else if (errorCode === 1000001) {  //token失效处理 状态码不一定相同
        ElMessage.error(TOKEN_INVALID)
        setTimeout(() => {
            router.push('/login')
            storage.clearAll()
        }, 1500)
        return Promise.reject(TOKEN_INVALID)
    } else {
        ElMessage.error(errorMessage || NETWORK_ERROR)
        return Promise.reject(errorMessage || NETWORK_ERROR)  //统一报错
    }
},(err) => {
    //响应状态码!==200进入
    const {errorMessage} = err.response?.data || {}
    ElMessage.error(errorMessage || NETWORK_ERROR)
    return Promise.reject(errorMessage || NETWORK_ERROR)
})

核心请求函数

function request(options) {
    options.method = options.method || 'get'
    if (options.method.toLowerCase() === 'get') {
        options.params = options.data;
    }
    let isMock = config.mock;
    if (typeof options.mock != 'undefined') {
        isMock = options.mock;
    }
    if (config.env === 'prod') {
        service.defaults.baseURL = config.baseApi
    } else {
        service.defaults.baseURL = isMock ? config.mockApi : config.baseApi
    }
    return service(options)
}

为该实例的所有方法添加

['get', 'post', 'put', 'delete', 'patch'].forEach((item) => {
    request[item] = (url, data, options) => {
        return request({
            url,
            data,
            method: item,
            ...options
        })
    }
})

export default request;  //最后暴露request

请求案例

   function login(params) {
        return request({
            url: '/admin/auth/login',
            method: 'post',
            data: params
        })
    },

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值