axios+ts封装

http.ts

javascript 复制代码
import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import qs from 'qs'

/**
 * 扩展AxiosRequestConfig,增加一些自定义的属性
 * isAuth: 自定义的参数中,用来判断是否携带token  因为AxiosRequestConfig本身定义的有 auth 所以这里使用 isAuth;
 */
interface AxiosRequestConfigExt extends AxiosRequestConfig {
  isAuth?: boolean //是否携带token
  showLoading?: boolean //是否显示加载框
  error401toLogin?: boolean //是否将401错误重定向到登录页面
  dataType?: string //数据类型
  queryData: any //查询参数
}

let timerId: number = 0

class Http {
  axios: AxiosInstance = null
  constructor() {
    this.axios = axios.create({
      baseURL: 'http://localhost:5173',
      timeout: 10000,
    })

    //请求拦截器
    this.axios.interceptors.request.use(
      (config: AxiosRequestConfig): AxiosRequestConfig => {
        return config
      },
      (error: any) => {
        console.log(error)
        return Promise.reject(error)
      },
    )

    //响应拦截器
    this.axios.interceptors.response.use(
      (response: AxiosResponse) => {
        return response.data
      },
      (error: any) => {
        console.log(error)
        let message = '网络错误'
        if (error.response.status === 401) {
          message = '未登录或登录已过期,请重新登录'
          // 这里可以重定向到登录页面
          window.location.href = '/login'
        }

        if (error.response.status === 403) {
          message = '权限不足,请联系管理员'
        }

        if (error.response.status === 404) {
          message = '请求地址不存在'
        }

        if (error.response.status === 500) {
          message = '服务器内部错误'
        }

        console.log(message)
        //弹出提示框
        //showToast(message)
        return Promise.reject(error)
      },
    )
  }

  request<T>(config: AxiosRequestConfigExt): Promise<T> {
    let {
      url,
      queryData = {},
      isAuth = false,
      showLoading = false,
      method = 'GET',
      dataType = 'json',
    } = config

    if (showLoading) {
      //显示加载框 //如果请求的响应时间小于200毫秒 则不显示加载框
      //因为 timerid 是一个全局变量,所以每次请求都会覆盖之前的定时器
      //如果请求都比较快的话,只有最后一次请求才会显示加载框
      clearTimeout(timerId)
      timerId = setTimeout(() => {
        console.log('这里添加显示加载框的代码')
      }, 200)
    }

    if (isAuth) {
      let token = localStorage.getItem('token')
      if (!token) {
        //这里可以返回错误,也可以重定向到登录页面
        return Promise.reject('未登录')
      }
      config.headers['token'] = token
    }

    if (method?.toUpperCase() === 'GET') {
      return this.axios.get(url, { params: queryData })
    }

    if (method?.toUpperCase() === 'POST') {
      if (dataType === 'json') {
        return this.axios.post(url, queryData, { headers: { 'Content-Type': 'application/json' } })
      } else if (dataType === 'formData') {
        let formData = new FormData()
        Object.keys(queryData).forEach((key) => {
          formData.append(key, queryData[key])
        })
        return this.axios.post(url, formData, {
          headers: { 'Content-Type': 'multipart/form-data' },
        })
      } else if (dataType === 'qs') {
        return this.axios.post(url, qs.stringify(queryData), {
          headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        })
      }
    }

    return Promise.reject('请求方式不正确')
    //后面如果有其他的请求方式,可以继续扩展
  }
}

export default new Http()
相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄2 天前
JavaScript 隐式全局变量解析
javascript