封装axios

封装axios

引入axios

import axios from 'axios'

创建axios实例

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

请求拦截

​ 先创建一下axios 然后添加请求的拦截器,请求的拦截器先判断localstorage有没有token 通过storage.getItem()读取,并赋值,

然后会把headers.Authorization字段设置成’Bearer’ + token

service.interceptors.request.use((req) => {
    const headers = req.headers;
    const { token = "" } = storage.getItem('userInfo') || {};
    if (!headers.Authorization) headers.Authorization = 'Bearer ' + token;
    return req;
})
//请求拦截

响应拦截

判断状态码 如果通过就返回数据,如果token过期就会跳转回登陆页面

返回Promise.reject(TOKEN_INVALID)方便调用时处理回调

别的状态的话就提示错误信息,或者提示网络不佳 并且返回Promise.reject(msg||NETWORK_ERROR),可以定义一些关键字来更好的响应。

const TOKEN_INVALID = 'Token认证失败,请重新登录'
const NETWORK_ERROR = '网络请求异常,请稍后重试'
service.interceptors.response.use((res) => {
    const { code, data, msg } = res.data;
    if (code === 200) {
        return data;
    } else if (code === 500001) {
        ElMessage.error(TOKEN_INVALID)
        setTimeout(() => {
            router.push('/login')
        }, 1500)
        return Promise.reject(TOKEN_INVALID)
    } else {
        ElMessage.error(msg || NETWORK_ERROR)
        return Promise.reject(msg || NETWORK_ERROR)
    }
})

定义request函数

​ request函数传入一个配置项,因为之前已经定义过baseUrl,所以里面只需要包含要跳转的url,发送的数据,请求的方法,还有其他配置项,比如说因为实际业务中前端经常需要mock数据,所以添加一个属性mock,设置为true的时候需要修改一下service.default.baseURL=‘’;如果需要传参数,那么可以设置一下params字段,将params字段设置成options.data

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)
}

​ 但是调用的时候传入配置项实际上是一件很不方便的事,我们可以不传入每个配置项的值,通过定义默认值的方式来实现少传参数,但是传入的参数需要写成对象的字符串形式,非常不方便,所以我们可以定义一些更为简单的方式来达到这个效果,

​ 较为常见的一种方式是 定义一些函数request.get(arguement[]),request.post(arguement[])…如果一个一个方法的调用那么需要产生很多重复的内容,所以我采用了数组的forEach方法来低耦合的达到这个效果。

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

版权声明:本文为A2101526039原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。