v3+ts/request封装axios

 1.创建一个新的axios实例

2.请求拦截器,如果有token进行头部携带

3.响应拦截器a.剥离无效数据b.处理token失效

4.导出一个函数,调用当前的axios实例发请求,返回值promise

import axios, { AxiosError, type Method } from 'axios'
import { useUserStore } from '@/stores/user' //pinia存储
import router from '@/router'
import { showToast } from 'vant'
//导出基准地址,原因:其他地方不是通过axios发请求的地方用上基准地址
const baseURL = 'https://consult-api.itheima.net/'
const instance = axios.create({
//axios的一些配置,baseUrl timeout
  baseURL,
  // 基础地址。超时时间
  timeout: 10000
})
// 请求拦截器,携带toekn
instance.interceptors.request.use(
//config是请求配置
  (config) => {
    const store = useUserStore()
    if (store.user?.token && config.headers) {
//请求头设置token
      config.headers['Authorization'] = `Bearer ${store.user?.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)
// 响应拦截器 ,剥离无效数据,401拦截
instance.interceptors.response.use(
  (res) => {
    // 后台约定,响应成功,但是code不是10000,是业务逻辑失败
    if (res.data?.code !== 10000) {
      showToast(res.data?.message || '业务失败')
      return Promise.reject(res.data)
    }
    // 业务逻辑成功,返回成功数据,作为axios成功的结果
    return res.data
  },
  (err) => {
    if (err.response.status === 401) {
      // 删除用户信息
      const store = useUserStore()
      store.delUser()
      //   跳转登录,带上接口失效所在页面的地址,登录完成后回跳使用
      router.push({
        path: 'login',
        // 将当前页面的完整路径作为值存储在"returnUrl"键下
        query: { returnUrl: router.currentRoute.value.fullPath }
      })
    }
    return Promise.reject(err)
  }
)

type Data<T> = {
  code: number
  message: string
  data: T
}

// 4. 请求工具函数
const request = <T>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  // request<数据类型,数据类型>() 这样才指定了 res.data 的类型
  return instance.request<T, Data<T>>({
    url,
    method,
//1.如果是get请求,需要使用params来传递submitData     ?a=10&c=10
//2.如果不是get请求,需要使用data传递submitData      请求体传参
//[]设置一个动态的key,写js表达式,js表达式的执行结果来当key
//methods参数:get,Get,GET转换成消息再来判断
    [method.toLocaleLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
export { instance, baseURL, request }

相关推荐

  1. v3+ts/request封装axios

    2024-06-16 16:14:02       31 阅读
  2. vue3 axios二次封装

    2024-06-16 16:14:02       66 阅读
  3. HBuilderX uniapp+vue3+vite axios封装

    2024-06-16 16:14:02       30 阅读
  4. Vue3+Vite+Axios Request 请求封装(TS版本)最新

    2024-06-16 16:14:02       36 阅读
  5. Vue3框架搭建2:axios+typescript封装

    2024-06-16 16:14:02       28 阅读
  6. vue3 学习笔记04 -- axios的使用及封装

    2024-06-16 16:14:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 16:14:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 16:14:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 16:14:02       87 阅读
  4. Python语言-面向对象

    2024-06-16 16:14:02       96 阅读

热门阅读

  1. Vue基础面试题(三)

    2024-06-16 16:14:02       29 阅读
  2. Web前端指令符:解码、应用与挑战

    2024-06-16 16:14:02       24 阅读
  3. 【无标题】

    2024-06-16 16:14:02       21 阅读
  4. 超级数据查看器 教程pdf 1-31集 百度网盘

    2024-06-16 16:14:02       39 阅读
  5. Oracle数据库之多行函数(十九)

    2024-06-16 16:14:02       32 阅读
  6. js 刷题常用方法

    2024-06-16 16:14:02       30 阅读
  7. [C++] 小游戏 斗破苍穹 2.11.6 版本 zty出品

    2024-06-16 16:14:02       31 阅读
  8. 什么是仲裁器(Arbiter)?

    2024-06-16 16:14:02       85 阅读
  9. C++学习(21)

    2024-06-16 16:14:02       39 阅读
  10. (53)MOS管专题--->(08)MOS管N沟道MOS管

    2024-06-16 16:14:02       35 阅读
  11. MySQL 考证作用

    2024-06-16 16:14:02       32 阅读