当前位置: 首页 > article >正文

vue3 Ts axios 封装

vue3 Ts axios 封装

axios的封装

import axios, { AxiosError, AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosRequestConfig, AxiosHeaders } from 'axios'
import qs from 'qs'
import { config } from './config'
import { ElMessage } from 'element-plus'// 从配置文件中提取相关配置
const { base_url, request_timeout, result_code } = config// 创建 axios 实例
const service: AxiosInstance = axios.create({// 设置基础 URL,所有请求都会在这个地址基础上进行拼接baseURL: base_url,// 设置请求超时时间(单位:毫秒),超过这个时间还没响应则认为请求失败timeout: request_timeout,// 允许携带凭证(如 Cookie),用于处理跨域请求时需要传递 Cookie 的情况withCredentials: true,// 设置默认请求头,这里设置为 application/json,表示发送 JSON 格式的数据headers: { 'Content-Type': 'application/json' },// 自定义参数序列化函数,用于处理请求参数的序列化paramsSerializer: (params: any): string => {// 使用 qs 库进行参数序列化,并允许使用点号表示嵌套对象return qs.stringify(params, { allowDots: true })}
})// request 拦截器,用于在请求发送前对请求进行处理
service.interceptors.request.use((config: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {// 获取请求方法,并转换为大写const method = config.method?.toUpperCase()// 如果是 GET 请求if (method === 'GET') {// 设置请求头,防止 GET 请求缓存config.headers['Cache-Control'] = 'no-cache'config.headers['Pragma'] = 'no-cache'}// 如果是 POST 请求else if (method === 'POST') {// 获取请求头中的 Content-Typeconst contentType = config.headers['Content-Type'] || config.headers['content-type']// 如果 Content-Type 是 application/x-www-form-urlencodedif (contentType === 'application/x-www-form-urlencoded') {// 如果请求数据存在且不是字符串类型if (config.data && typeof config.data !== 'string') {// 使用 qs 库将请求数据序列化为 URL 编码格式的字符串config.data = qs.stringify(config.data)}}}// 返回处理后的配置,继续请求流程return config},(error: AxiosError): Promise<AxiosError> => {// 如果请求发生错误,返回错误的 Promisereturn Promise.reject(error)}
)// response 拦截器,用于在接收到响应后对响应进行处理
service.interceptors.response.use(async (response: AxiosResponse<any>): Promise<any> => {// 获取响应数据let { data } = response// 如果响应数据不存在if (!data) {// 抛出错误,表示请求没有返回值throw new Error()}// 如果响应的 responseType 是 blob 或 arraybuffer(处理二进制数据,如文件下载)if (response.request.responseType === 'blob' ||response.request.responseType === 'arraybuffer') {// 如果响应的数据类型不是 application/jsonif (response.data.type !== 'application/json') {// 直接返回响应数据,进行文件下载等操作return response.data}// 如果响应的数据类型是 application/json,说明可能导出失败,将响应数据转换为 JSON 格式data = await new Response(response.data).json()}// 返回处理后的响应数据return data},(error: AxiosError): Promise<AxiosError> => {// 打印错误信息,用于调试console.log('err' + error)// 获取错误信息let { message } = error// 显示错误消息提示ElMessage.error(message)// 返回错误的 Promise,继续错误处理流程return Promise.reject(error)}
)// 导出 axios 实例,供其他模块使用
export { service }

封装get post delete 方法

import { service } from './service'
import { config } from './config'const { default_headers } = config// 定义请求方法的类型
type RequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' // 定义请求配置的类型
interface RequestOptions {method?: RequestMethodurl?: stringdata?: anyparams?: anyheaders?: anyresponseType?: 'json' | 'blob' | 'arraybuffer'headersType?: string[key: string]: any
}// 封装请求方法,用于统一处理请求配置
const request = (options: RequestOptions): Promise<AxiosResponse<any>> => {// 解构请求配置,提取 headersType 和 headersconst { headersType, headers, ...otherOptions } = options// 使用 service 发起请求// 合并请求头,优先使用 headersType 或 default_headers,然后合并 headersreturn service({...otherOptions,headers: {'Content-Type': headersType || default_headers, // 设置 Content-Type...headers // 合并其他请求头}})
}// 定义请求工具类,提供各种 HTTP 请求方法
export default {// GET 请求方法get: async <T = any>(option: RequestOptions): Promise<T> => {// 发起 GET 请求const res = await request({ method: 'GET', ...option })// 返回响应数据,并将其转换为指定类型return res.data as unknown as T},// POST 请求方法post: async <T = any>(option: RequestOptions): Promise<T> => {// 发起 POST 请求const res = await request({ method: 'POST', ...option })// 返回响应数据,并将其转换为指定类型return res.data as unknown as T},// 原始 POST 请求方法,返回完整的响应对象postOriginal: async (option: RequestOptions): Promise<AxiosResponse<any>> => {// 发起 POST 请求const res = await request({ method: 'POST', ...option })// 返回完整的响应对象return res},// DELETE 请求方法delete: async <T = any>(option: RequestOptions): Promise<T> => {// 发起 DELETE 请求const res = await request({ method: 'DELETE', ...option })// 返回响应数据,并将其转换为指定类型return res.data as unknown as T},// PUT 请求方法put: async <T = any>(option: RequestOptions): Promise<T> => {// 发起 PUT 请求const res = await request({ method: 'PUT', ...option })// 返回响应数据,并将其转换为指定类型return res.data as unknown as T},// 下载文件的请求方法download: async <T = any>(option: RequestOptions): Promise<T> => {// 发起 GET 请求,设置 responseType 为 blob,用于处理文件下载const res = await request({ method: 'GET', responseType: 'blob', ...option })// 返回响应数据,并将其转换为指定类型return res as unknown as Promise<T>},// 上传文件的请求方法upload: async <T = any>(option: RequestOptions): Promise<T> => {// 设置 headersType 为 multipart/form-data,用于文件上传option.headersType = 'multipart/form-data'// 发起 POST 请求const res = await request({ method: 'POST', ...option })// 返回响应数据,并将其转换为指定类型return res as unknown as Promise<T>}
}

相关文章:

vue3 Ts axios 封装

vue3 Ts axios 封装 axios的封装 import axios, { AxiosError, AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosRequestConfig, AxiosHeaders } from axios import qs from qs import { config } from ./config import { ElMessage } from element-plus// …...

CyberAgentAILab 开源数字人项目TANGO,heygen的开源版来了~

简介 TANGO 是 CyberAgentAILab 开源的一项前沿研究成果&#xff0c;其初衷在于探索高效生成模型在实际应用场景中的表现。项目诞生于 CyberAgent 在整合创意与人工智能的实践中&#xff0c;旨在为数字内容生成、交互和实时渲染等领域提供一个高性能、模块化、可扩展的解决方案…...

ROS ROS2 机器人深度相机激光雷达多传感器标定工具箱入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、安装 1.1 ROS 2 官方软件包 二、教程 2.1 标定配置器 2.1.1 机器人选项 2.1.2.1 外参相机-激光雷达标定 2.1.2.2 外参激光雷达-激光雷达标定 2.1.2.3 外参相机参照标定 2.1.2.4 外参激光雷达-参考标定 2.2 外参照相机-激…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(6):ながら 一边。。一边

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;6&#xff09;&#xff1a;ながら 一边。。一边 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;ながら1&#xff09;一边。。一边2&#xff0…...

从EOF到REOF:如何用旋转经验正交函数提升时空数据分析精度?

目录 1. 基本概念与原理2. 应用场景3. 与传统EOF的区别4. 技术实现5. 其他领域中的“REOF”参考资料 REOF 的输入是多个地区在不同时间的气候数据&#xff08;如温度或降雨量&#xff09;&#xff0c;它的作用是通过旋转计算找出这些数据中最主要的变化规律&#xff0c;输出则是…...

【HDFS入门】HDFS与Hadoop生态的深度集成:与YARN、MapReduce和Hive的协同工作原理

目录 引言 1 HDFS核心架构回顾 2 HDFS与YARN的集成 3 HDFS与MapReduce的协同 4 HDFS与Hive的集成 4.1 Hive架构与HDFS交互 4.2 Hive数据组织 4.3 Hive查询执行流程 5 HDFS在生态系统中的核心作用 6 性能优化实践 7 总结 引言 在大数据领域&#xff0c;Hadoop生态系统…...

用 AI 十天开发小程序:探秘 “幸运塔塔屋” 之 “解惑指南书” 功能

在当今软件开发领域&#xff0c;AI 技术正以前所未有的速度改变着我们的开发方式。我仅用十天时间&#xff0c;借助 AI 成功开发出 “幸运塔塔屋” 小程序&#xff0c;其中 “解惑指南书” 功能别具一格。今天&#xff0c;就为大家详细剖析这个功能从构思到落地的全过程。 十天…...

直流电源基本原理

整流电路 在构建整流电路时&#xff0c;要选择合适参数的二极管 If是二极管能够通过电流的能力&#xff0c;也是最大整流的平均电流。 还要考虑二极管的反向截至电压。 脉动系数电压交流幅值/直流平均电压&#xff08;越小越好&#xff09; 三相整流电路优点&#xff1a; …...

osu ai 论文笔记 DQN

e https://theses.liacs.nl/pdf/2019-2020-SteeJvander.pdf Creating an AI for the Rhytm Game osu! 20年的论文 用监督学习训练移动模型100首歌能达到95准确率 点击模型用DQN两千首歌65准确率 V抖用的居然不是强化学习&#xff1f; 5,6星打96准确度还是有的东西的 这是5.…...

MapReduce实验:分析和编写WordCount程序(对文本进行查重)

实验环境&#xff1a;已经部署好的Hadoop环境 Hadoop安装、配置与管理_centos hadoop安装-CSDN博客 实验目的&#xff1a;对输入文件统计单词频率 实验过程&#xff1a; 1、准备文件 test.txt文件&#xff0c;它是你需要准备的原始数据文件&#xff0c;存放在你的 Linux 系…...

Windows Acrobat Pro DC-v2025.001.20435-x64-CN-Portable便携版

Windows Acrobat Pro 链接&#xff1a;https://pan.xunlei.com/s/VOO1nMjQ1Qf53dyISGne0c_9A1?pwdsfgn# Acrobat Pro 2024 专业增强版特色 ● 创建和编辑 PDF 文件&#xff1a;可以将各种类型的文档转换为 PDF 格式&#xff0c;并进行编辑和修改。 ● 合并和拆分 PDF&#…...

二十、FTP云盘

1、服务端 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h>…...

【4】k8s集群管理系列--harbor镜像仓库本地化搭建

一、harbor基本概念 ‌Harbor是一个由VMware开源的企业级Docker镜像仓库解决方案‌&#xff0c;旨在解决企业在容器化应用部署中的痛点&#xff0c;提供镜像存储、管理、安全和分发的全生命周期管理‌。Harbor扩展了Docker Registry&#xff0c;增加了企业级功能&#xff0c;如…...

Oracle 12.1.0.2补丁安装全流程

第一步&#xff0c;先进行备份 tar -cvf u01.tar /u01 第二步&#xff0c;更新OPatch工具包 根据补丁包中readme信息汇总提示的信息&#xff0c;下载对应版本的OPatch工具包&#xff0c;本次下载的版本为&#xff1a; p6880880_122010_Linux-x86-64.zip opatch版本为最新的…...

【AAOS】【源码分析】Car UX Restrictions

AAOS UX的核心理念:安全驾驶是驾驶员的首要责任。汽车制造商和应用程序开发人员的所有设计都必须反映这一优先事项。 AAOS平台允许设备制造商(OEM)对不同驾驶状态下的限制进行定制。 驾驶员分心指南 只有符合Driver Distraction Guidelines的应用才可以在驾驶过程中运行。…...

解读《人工智能指数报告 2025》:洞察 AI 发展新态势

美国斯坦福大学 “以人为本人工智能研究院”&#xff08;HAI&#xff09;近日发布的第八版《人工智能指数报告》&#xff08;AI Index Report 2025&#xff09;备受全球瞩目。自 2017 年首次发布以来&#xff0c;该报告一直为政策制定者、研究人员、企业高管和公众提供准确、严…...

【SpringBoot+Vue自学笔记】003 SpringBoot Controll

跟着这位老师学习的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 这段话的意思其实是&#xff1a;Spring Boot 简化了传统 Web 项目的搭建流程&#xff0c;让你少折腾配置&#xff0c;直接开搞业务逻辑。 &#x1f52…...

探索Web3平台的数据安全和保护机制

在数字化时代&#xff0c;Web3 平台以其去中心化、透明性和用户主权等特点&#xff0c;正逐渐成为互联网技术的新宠。然而&#xff0c;随着数据价值的日益凸显&#xff0c;Web3 平台的数据安全和保护机制变得尤为重要。本文将深入探讨 Web3 平台的数据安全和保护机制&#xff0…...

基于ssh密钥访问远程Linux

1、在本地机器上生成密钥对&#xff08;默认保存在 ~/.ssh/&#xff09; ssh-keygen -t ed25519 或使用 RSA(兼容性更好)&#xff1a; ssh-keygen -t rsa -b 4096 2、 将公钥上传到远程主机 方法一&#xff1a;使用 ssh-copy-id ssh-copy-id -i ~/.ssh/id_ed25519.pub us…...

《基于神经网络实现手写数字分类》

《基于神经网络实现手写数字分类》 一、主要内容&#xff1a; 1、通过B站陈云霁老师的网课&#xff0c;配合书本资料&#xff0c;了解神经网络的基本组成和数学原理。 2、申请云平台搭建实验环境 3、基于5个不同的实验模块逐步理解实验操作步骤&#xff0c;并实现不同模块代码…...

1 cline 提示词工程指南-架构篇

cline 提示词工程指南-架构篇 本篇是 cline 提示词工程指南的学习和扩展&#xff0c;可以参阅&#xff1a; https://docs.cline.bot/improving-your-prompting-skills/prompting 前言 cline 是 vscode 的插件&#xff0c;用来在 vscode 里实现 ai 编程。 它使得你可以接入…...

代理模式简述

目录 一、主要角色 二、类型划分 三、静态代理 示例 缺点 四、动态代理 JDK动态代理 示例 缺点 CGLib动态代理 导入依赖 示例 五、Spring AOP 代理模式是一种结构型设计模式&#xff0c;通过代理对象控制对目标对象的访问&#xff0c;可在不改变目标对象情况下增强…...

Operator 开发入门系列(一):Hello World

背景 我们公司最近计划将产品迁移到 Kubernetes 环境。 为了更好地管理和自动化我们的应用程序&#xff0c;我们决定使用 Kubernetes Operator。 本系列博客将记录我们学习和开发 Operator 的过程&#xff0c;希望能帮助更多的人入门 Operator 开发。 目标读者 对 Kubernete…...

【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法

使用docker拉取Dify的时候遇到错误 错误提示 unknown shorthand flag: d in -dUsage: docker [OPTIONS] COMMAND [ARG...]错误原因解析 出现 unknown shorthand flag: d in -d 的根本原因是 Docker 命令格式与当前版本不兼容&#xff0c;具体分为以下两种情况&#xff1a; 新…...

【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能

引言 之前的文章已经介绍实现了AI对话窗口&#xff0c;但只有个空壳&#xff0c;没有实现功能。本次将集中完成对话窗口的功能&#xff0c;主要内容为&#xff1a; 模型动态切换&#xff1a;支持运行时加载配置的AI模型列表交互式输入处理&#xff1a;实现多行文本输入与Ctrl…...

在激烈竞争下B端HMI设计怎样打造独特用户体验?

在当今数字化高度发展的时代&#xff0c;B 端市场竞争愈发激烈。对于 B 端 HMI&#xff08;人机界面&#xff09;设计而言&#xff0c;打造独特的用户体验已成为在竞争中脱颖而出的关键因素。B 端用户在复杂的工作场景中&#xff0c;对 HMI 设计有着独特的需求和期望&#xff0…...

【Netty篇】Handler Pipeline 详解

目录 一、 Handler & Pipeline——流水线上的“特种部队”与“生产线”1、 ChannelHandler —— 流水线上的“特种兵”&#x1f46e;‍♂️2、 ChannelPipeline —— 生产线上的“接力赛跑”&#x1f3c3;‍♀️&#x1f3c3;‍♂️ 二、 代码实例1、 服务端代码示例2、 客…...

计算机网络 - UDP协议

通过一些问题来讨论 UDP 协议 什么是 UDP&#xff1f;举几个应用了 UDP 协议的例子UDP 与 TCP 有啥区别&#xff1f;&#xff08;PS&#xff1a;介绍三四个就可以了&#xff0c;不用说太多&#xff09;具体 UDP 是不可靠的&#xff0c;那你觉得如何实现一个可靠的 UDP &#x…...

16-算法打卡-哈希表-两个数组的交集-leetcode(349)-第十六天

1 题目地址 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;349. 两个数组的交集 - 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a;输入&#xff1a;nu…...

java + spring boot + mybatis 通过时间段进行查询

前端传来的只有日期内容&#xff0c;如&#xff1a;2025-04-17 需要在日期内容的基础上补充时间部分&#xff0c;代码示例&#xff1a; /*** 日志查询&#xff08;分页查询&#xff09;* param recordLogQueryDTO 查询参数对象* return 日志列表*/Overridepublic PageBean<…...