axios二次封装

310 阅读2分钟
// http.js这个文件主要对axios实现二次封装, 就是在axios请求发送之前, 预设axios的各种参数, 如,此项目中除了登录接口,每一个接口都需要登录认证, 每次请求都设置token比较麻烦, 可以在这里给请求预设请求头token, 实际发请求时就不需要再管理登录认证了, 这就是axios请求拦截

// 导入原始的axios请求插件
import axios from "axios";
// 导入element-plus中的加载 Loading 服务, (vite工具中在components.d.ts中会自动全局引入, 在这里无需再导入, 并且再次导入loading会失效)
// import { ElLoading } from 'element-plus'
let loading:object;

// 功能1: 设置axios的baseUrl,在发起请求时, baseUrl无需再拼接, 还可以根据当前环境设置不同的baseUrl  (process.env.NODE_ENV 获取当前环境)    打包时就不用改了
if(process.env.NODE_ENV == "development"){
    // 如果当前是开发环境, 就设置基础路径为代理地址
    axios.defaults.baseURL = "/cige/api/private/v1/"
}
else if(process.env.NODE_ENV == "production"){
    // 如果当前是生产环境(打包时), 就设置基础路径为同源地址或原始地址
    axios.defaults.baseURL = "/api/private/v1/"
}

// 功能2: 请求拦截, 在所有请求发送之前, 向请求头添加token值
axios.interceptors.request.use(request => {
    // 请求发送前,被拦截下来,执行这个回调, 参数request就是请求对象(原生ajax种xhr对象)
    // console.log("请求数据", request);
    // 给请求对象添加请求头,把token加入请求头, 执行登录认证
    const token:any = localStorage.getItem("token")
    if(token){
        request.headers.Authorization = token
    }
    // 在请求发送之前, 开启加载服务, 显示加载框, target指定显示加载的元素
    if(loading) loading.close() 
    loading = ElLoading.service({ target: ".refresh_box" })
    // 处理完请求数据后, 返回继续发送请求
    return request; 
})

// 功能3: 响应拦截, 在响应数据接收之前, 对响应数据做预处理
axios.interceptors.response.use(response => {
    // console.log("响应数据", response);
    // 请求完成时, 关闭加载框
    loading.close()
    loading = null
    // 处理完响应数据后, 把响应数据中的data字段提出来, 返回继续执行响应 
    return response.data; 
})

// 功能4: 加载提示框, 发起ajax请求时, 开始加载, 请求结束时, 结束加载, 详情请见上边的请求拦截和响应拦截

// 功能5: 针对post/put/delete请求, 需要设置请求头数据格式, 可以在此处统一设置
// axios.defaults.headers("Content-Type", "application/x-www-form-urlencoded")

// 返回二次封装后的axios
export default axios;

// 导入二次封装的请求插件
import http from "./http.js";

// 登录
const postLogin = (params:object):object => http.post('login', params);



export {
    postLogin,
  
}