TS+Axios的封装(vue3.x环境)

news2025/1/19 13:21:26

1. 创建axios实例

# 项目src下新建utils/request.ts
# npm i axios 是必须滴
import axios from 'axios'

const baseURL = 'https://ilovesh.com' // 基地址
const instance = axios.create({
  baseURL,
  timeout: 3000 // 请求超时时间 (3秒超时)
})

export { baseURL, instance }

2. 添加拦截器

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

3. 剥离数据

// 把上图圈出的数据剥离出来
// 修改响应拦截器的return值
...
function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response.data
}
...

4. 请求头携带Token

笔者首先在 App.vue 里写了个测试用例,先拿到Token:

import { instance } from '@/utils/request'
import { useUserStore } from '@/stores'

// pinia仓库
const userStore = useUserStore()

instance
  .post('/login/password', {
    mobile: '13230000001',
    password: 'abc12345'
  })
  .then((res) => {
    // 调用仓库里的自定义存储方法 (现在仓库里有Token了)
    userStore.updateUser(res.data)
  })

接下来修改axios实例的请求拦截器(在请求头里携带Token):

instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 获取Pinia仓库
    const userStore = useUserStore()
    const token = userStore.user?.token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

配置完成后,最好能找个需要Token才能访问的接口测试一下!

5. 业务状态码出错的处理

这里指的是响应是成功的(2xx 范围内的状态码),业务是失败的。笔者这里的业务逻辑成功与否根据code区分,code = 10000 成功,code !== 10000 失败

 修改axios实例的响应拦截器:

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数
    // 对响应数据做点什么
    const { code, message } = response.data
    if (code !== 10000) return Toast(message) // 这里使用vant库的轻提示组件
    return response.data
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

6. 响应状态码401报错的处理

状态码 401 Unauthorized 代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。说人话就是“Token失效/出错”!

为了尽可能追求完美,这里的逻辑比较复杂:

① Token失效,使用路由转回登录页

② 假设在 abc 页面访问,这里发现 Token 失效了,我们使用路由转回了登录页;

        重新登录成功后,体验好的app会让我回到本来访问的abc页面,并且携带可能的路径参数;

③ 实现方式:把原本的页面路径&参数全部给到query带上,重新登录成功就能完美转回了;

        如何获取原本页面的路径&参数?使用 router.currentRoute.value.fullpath

// 响应拦截器失败的函数内修改
function (error: AxiosError) {
  // 超出 2xx 范围的状态码都会触发该函数
  // 对响应错误做点什么
  if (error.response?.status === 401) {
    // Pinia里删除用户信息
    const userStore = useUserStore()
    userStore.delUser()
    // 跳转登录,带上接口失效所在页面的地址,登录完成后回跳使用
    router.push({
      path: '/login',
      query: { redirectURL: router.currentRoute.value.fullPath }
    })
  }
  return Promise.reject(error)
}

7. 封装请求函数&配泛型

# 使用axios实例的伪代码
instance({
  method: '',
  url: '',
  params / data (get请求的时候是params,get请求以外的是data)
})

# 希望封装一个函数,它的使用是 request<泛型>(url, method, 可能有/可能无的接口请求参数)

 雏形大概长这样:

import axios, { AxiosError, type Method } from 'axios'

// 请求工具函数
const request = (url: string, method: Method = 'get', requestParams?: object) => {
  return instance.request({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: requestParams
  })
}

// 按需导出
export { baseURL, instance, request }

加上泛型的最终版

// 这个需要替换 axios.request 默认的响应成功后的结果类型
// 之前是:传 { name: string } 然后res是   res = { data: { name: string } }
// 但现在:在响应拦截器中返回了 res.data  也就是将来响应成功后的结果,和上面的类型一致吗?
// 所以要:request<数据类型,数据类型>() 这样才指定了 res.data 的类型
// 但是呢:后台返回的数据结构相同,所以可以抽取相同的类型
import axios, { AxiosError, type Method } from 'axios'
type Data<T> = {
  // 内容根据接口返回的规则做修改
  code: number
  message: string
  data: T
}
// 请求工具函数
const request = <T>(url: string, method: Method = 'get', requestParams?: object) => {
  return instance.request<T, Data<T>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: requestParams
  })
}

// 按需导出
export { baseURL, instance, request }

使用范例:

import { request } from '@/utils/request'
import type { User } from '@/types/user'

request<User>('/login/password', 'post', {
  mobile: '13230000001',
  password: 'abc12345'
}).then((res) => {
  // 调用仓库里的自定义存储方法
  userStore.updateUser(res.data)
})

End-------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

龙蜥社区理事长马涛当选开放原子开源基金会 TOC 副主席

近日&#xff0c;开放原子开源基金会举办了技术监督委员会&#xff08;以下简称“TOC”&#xff09;第六十九次全体会议&#xff0c;会上针对新一届 TOC 成员改选进行了公正公平的投票&#xff0c;龙蜥社区理事长马涛当选开放原子开源基金会 TOC 副主席。 &#xff08;图左二/龙…

(排序8)归并排序(非递归实现),归并排序的外部排序应用(文件排序)的简单了解

归并排序递归版本 void _MergeSort(int* arr, int left , int right, int* tmp) {if (left > right){return;}int mid (left right) / 2;_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid 1, right, tmp);int begin1 left;int end1 mid;int begin2 mid 1;int e…

一文掌握 Python、Anaconda、PyCharm 的安装和使用

本文将介绍一个较为全面的 Python 开发环境的搭建与基本使用&#xff0c;包括 Python 解释器的安装使用、PyCharm 编辑器的安装使用、Anaconda 的安装使用和库管理工具 pip 的使用。 PyCharm Anaconda 是一个很完备的 Python 开发环境&#xff0c;也是绝大多数开发者使用的开发…

E6410安装PVE直通显卡安装LibreELEC系统

文章目录查看cpu是否支持直通音频笔记本关盖设定BIOS设定启动内核IOMMU支持添加驱动黑名单绑定核显到vfio模块然后新建一个虚拟机安装LibreELEC注意事项重启 VM 时 GPU 直通失败如果直通后遇到问题了&#xff0c;开机出现各种问题&#xff0c;进不去系统&#xff0c;或者网页进…

【MySQL数据库原理】数据库批量导入美团NLP分类数据集Meituan-Dianping/asap

目录 数据集简单介绍完整代码实现参考资料数据集简单介绍 美团点评数据集 (Meituan-Dianping/asap) 是一个中文自然语言处理 (NLP) 数据集,由美团点评公司收集和发布。该数据集用于评估和开发中文文本分类和情感分析模型,包括情感极性分类、食物安全文本分类和自定义分类等任…

【分布式应用】Zabbix——安装

目录 第一章zabbix概述 1.1.什么是监控概念 1.2.zabbix概述 1.3.zabbix 主要特点 1.4.zabbix主要功能 1.5.zabbix运行机制 1.6.zabbix 监控原理 1.7zabbix的架构&#xff0c;数据流向以及原理在图中做总结 1.8.数据采集模式 1.9.zabbix监控模式 第二章.安装 部署 za…

Hyper-v下安装CentOS-Stream-9

1、我不想要动态扩展的硬盘&#xff0c;固定大小硬盘性能更高&#xff0c;所以这里我先创建一个固定硬盘&#xff08;如果你想用动态扩展的硬盘&#xff0c;那么可以省略前面几步&#xff0c;直接从第7步开始&#xff0c;并在第12步选择创建可动态扩展的虚拟硬盘&#xff09;&a…

JAVA开发(神乎其神的区块链概念和技术)

由于我最近需要做一个关于区块链的项目&#xff0c;所以想写篇博文记录一下自己的一些疑惑。区块链技术最火爆的时间应该是2016年和2017年。它产生的背景是B特币兴起&#xff0c;一时间说虚拟货币将取代所有实物货币炒的沸沸扬扬。它的主要思想思想是去中心化。网络上给了很多概…

ubuntu虚拟机下搭建zookeeper集群,安装jdk压缩包,搭建Hadoop集群与spark集群的搭建【上篇】

系列文章目录 在vmbox里面安装Ubuntu16.04并且配置jdk以及Hadoop配置的教程【附带操作步骤】 虚拟机vmware下安装Ubuntu16.04修改屏幕尺寸与更新源&#xff0c;以及对应的安装vim和vim常见的操作 Hadoop与主机连接以及20版本的Hadoop配置网络的问题_hadoop连不上网 Hadoop升…

英文文档翻译软件-汉语文章翻译成英语

免费文章翻译软件的主要优点包括&#xff1a; 方便快捷&#xff1a;在线免费文章翻译软件使得翻译变得更加方便和快速&#xff0c;只需要将需要翻译的文本复制粘贴到输入框中&#xff0c;即可获取翻译结果。 费用低廉或免费&#xff1a;相对于一些专业的翻译服务或软件&#x…

AcWing语法基础班 1.1 变量、输入输出、表达式和顺序语句

预备知识 首先先来了解一下最简单的C代码。 本文的所有代码操作均在AcWing的AC Editor中 #include <iostream>using namespace std;int main(){cout << "Hello World" << endl;return 0; }然后使用编译&#xff08;点击调试&#xff0c;再点击运…

(3)基础强化:静态类静态成员,静态构造函数,抽象类抽象成员,值类型和引用类型,Ref

一、静态成员 1、方法重写注意事项 1&#xff09;子类重写父类方法时&#xff0c;必须与父类保持一致的方法签名与返回值类型。即: 方 法名、返回值类型、参数列表都必须保持一致。[访问修饰符也得一致] 2&#xff09;“方法签名”:一般是指…

Authing 新增 Gitee 、Github、抖音、快手、华为、小米、Gitlab、Oppo、Amazon、Slack、Line 等多种身份源

Authing 身份源新增&#xff1a; 移动端&#xff1a;Gitee 、Github、抖音、快手、华为、小米、Gitlab、Oppo、Amazon、Slack、LineWeb 端&#xff1a;Amazon 身份源提供商&#xff08;Identity Providers&#xff0c;简称 IdP&#xff09; 是一种身份认证服务&#xff0c;其主…

干货分享!提高项目执行力的六大方法

在当今竞争激烈的商业环境中&#xff0c;企业成功的关键在于实施高效的项目管理。项目执行力是一个企业能否在规定时间内交付高质量成果的重要因素。为了确保项目最终交付&#xff0c;企业需要采取以下措施提高项目执行力。 1、明确项目目标和时间表 首先&#xff0c;企业需要…

理解C语言中的空指针和野指针

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;可以用于操作变量和数据结构。但是&#xff0c;指针也是很容易出错的地方。其中包括两种可能的错误&#xff1a;空指针和野指针。 空指针 空指针指代无效的地址&#xff0c;表示指针不指向内存中的任何一个合法对象…

[oeasy]python0133_变量名_标识符_identifier_id_locals

变量名 回忆上次内容 上次讲了 什么是变量变量变量 能变的量 就是变量 各种系统、游戏就是由变量所组成的 声明了变量 并且 定义了变量 声明就是 declaration 把标识符 和 具体值 联系起来标识符就是 变量的标记符具体值 就是 赋给变量的值 过程就是 赋值 就是 assignment 可…

【id:35】【20分】E. Stack(类与构造)

题目描述 上面是栈类的定义&#xff0c;栈是一种具有先进后出特点的线性表&#xff0c;请根据注释&#xff0c;完成类中所有方法的实现&#xff0c;并在主函数中测试之。 堆栈类的说明如下&#xff1a; 1. 堆栈的数据实际上是保存在数组a中&#xff0c;而a开始是一个指针&…

Linux操作基础(进程和计划任务管理)

文章目录一 、程序和进程的关系1.1程序1.2进程1.3进程和线程的关系二 、查看进程的命令2.1 ps命令2.11 ps aux2.12 ps -elf2.3 top 命令2.4 pgrep命令2.5 进程的启动方式2.51 手工启动2.52 调度启用进程的前后台调度终止进程的运行2.6 kill命令三 、计划任务管理3.1使用at命令&…

Java面试技巧之每天一个Tip——SpringBean生命周期和作用域?

Spring Bean是个「古老的」问题&#xff0c;似乎面试中已经不常见了。 但是&#xff0c;偶尔&#xff0c;面试者还是会遭遇到这个问题&#xff0c;以至于被打了个措手不及&#xff0c;一脸懵。 为了防止出现类似的情况&#xff0c;Tip一下大家&#xff0c;很简单的Tip&#x…

nginx (uos)

安装nginx apt install nginx php php-fpm -y 切换目录 cd /etc/nginx vim /etc/nginx/conf.d/proxy.conf server { listen 80; ssl_certificate "/etc/nginx/nginx.crt"; ssl_certificate_key "/etc/nginx/nginx.key"; …