vue3+ts+vite axios封装请求并扩展入参

requset.ts

import axios, { AxiosResponse } from 'axios'
import { getToken, removeToken } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
  baseURL: '', // 所有的请求地址前缀部分(没有后端请求不用写)
  timeout: 60000 // 请求超时时间(毫秒)
  // withCredentials: true // 异步请求携带cookie
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    const token = getToken() || ''
    // 如果你要去localStor获取token,(如果你有)
    if (token) {
      // 设置 token 请求头
      config.headers['csg-token'] = token
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    if (response.config.handleResponse) {
      return response
    } else {
      const { code, msg } = response.data
      if (+code === 0) {
        return response.data
      } else if (+code === 59990001) {
        ElMessage.error('token过期请重新登陆!')
        return new Promise((_resolve, reject) => {
          reject(response.data)
          removeToken()
        })
      } else {
        ElMessage.error(response.data.msg)
        if (response.config.handleError) {
          return Promise.reject(response.data)
        } else {
          return Promise.reject(msg || '未知错误')
        }
      }
    }
  },
  (error) => {
    ElMessage.error(error.message)
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)
export default service

api.ts文件进行接口请求

export function excelExportArrivalGoods(data: any) {
  return request({
    url: settings.taskPrefix + '/adm/arrivalGoods/excel-export',
    method: 'post',
    data,
    handleResponse: true,
    responseType: 'blob'
  })
}

会发现handleResponse参并不在axios提供的类型中

解决办法就是扩展 AxiosResponse接口参数在request.ts页面中加入

declare module 'axios' {
  export interface AxiosRequestConfig {
    handleResponse?: boolean // 可以根据需要设置为其他类型
    handleError?: boolean // 同理,根据需要设置
    // ... 其他自定义属性
  }
}

最后发现api也不报红了

完整的代码

import axios, { AxiosResponse } from 'axios'
import { getToken, removeToken } from '@/utils/auth'
// 扩展 AxiosRequestConfig 以包含 handleResponse 属性
declare module 'axios' {
  export interface AxiosRequestConfig {
    handleResponse?: boolean // 可以根据需要设置为其他类型
    handleError?: boolean // 同理,根据需要设置
    // ... 其他自定义属性
  }
}
// 创建axios实例
const service = axios.create({
  baseURL: '', // 所有的请求地址前缀部分(没有后端请求不用写)
  timeout: 60000 // 请求超时时间(毫秒)
  // withCredentials: true // 异步请求携带cookie
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    const token = getToken() || ''
    // 如果你要去localStor获取token,(如果你有)
    if (token) {
      // 设置 token 请求头
      config.headers['csg-token'] = token
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    if (response.config.handleResponse) {
      return response
    } else {
      const { code, msg } = response.data
      if (+code === 0) {
        return response.data
      } else if (+code === 59990001) {
        ElMessage.error('token过期请重新登陆!')
        return new Promise((_resolve, reject) => {
          reject(response.data)
          removeToken()
        })
      } else {
        ElMessage.error(response.data.msg)
        if (response.config.handleError) {
          return Promise.reject(response.data)
        } else {
          return Promise.reject(msg || '未知错误')
        }
      }
    }
  },
  (error) => {
    ElMessage.error(error.message)
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)
export default service

相关推荐

  1. vue3中几种封装让后端传请求方式

    2024-03-24 18:36:03       29 阅读
  2. SpringBoot-打印请求和出

    2024-03-24 18:36:03       18 阅读
  3. Vue3+Vite+Axios Request 请求封装(TS版本)最新

    2024-03-24 18:36:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 18:36:03       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 18:36:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 18:36:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 18:36:03       18 阅读

热门阅读

  1. C# System.Console.WriteLine的格式化输出

    2024-03-24 18:36:03       16 阅读
  2. C#面:简述可空类型

    2024-03-24 18:36:03       17 阅读
  3. 【2024-03-18】顺丰春招笔试两道编程题解

    2024-03-24 18:36:03       18 阅读
  4. 【串口开发】android 智能设备开发 知识笔记

    2024-03-24 18:36:03       20 阅读
  5. 学习笔记 | 微信小程序项目day06

    2024-03-24 18:36:03       22 阅读
  6. mysql基础02

    2024-03-24 18:36:03       14 阅读
  7. Kafka系列之:Exactly-once support

    2024-03-24 18:36:03       17 阅读
  8. 海量数据处理和提高系统的并发能力的一些方案

    2024-03-24 18:36:03       20 阅读
  9. 如何在ubuntu 18.04中升级python 3.6到3.7

    2024-03-24 18:36:03       19 阅读
  10. CCSK-云计算安全基础知识认证

    2024-03-24 18:36:03       18 阅读
  11. OpenCV中如何进行模板匹配?

    2024-03-24 18:36:03       19 阅读