axios和ts的简单使用

按照官网的使用案例简单记下笔记

1:安装

npm install axios

2:案例

一个简单的config配置信息

// 发起一个post请求
axios({method: 'post',url: '/user/12345',data: {firstName: 'Fred',lastName: 'Flintstone'}
});

case 

// 在 node.js 用GET请求获取远程图片
axios({method: 'get',url: 'http://bit.ly/2mTM3nY',responseType: 'stream'
}).then(function (response) {response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))});

上面都是官网的案例

在实际的项目中,在使用axios请求时,都会进行数据封装。

3:创建实例

封装一些耦合度高的请求配置

config.ts文件

封装一个基础的请求头配置,使用axios中内置的ts类型 AxiosRequestConfig属性限制

import { API_BASE_URL } from '@/utils/env'
import { AxiosRequestConfig } from 'axios'const baseURL = API_BASE_URLconst axiosConfig: AxiosRequestConfig = {baseURL,// 请求超时时间timeout: 30 * 1000,// 跨域是否带tokenwithCredentials: true,showMessageOnReject: true,
}
export default axiosConfig

创建实例

import config from './config'
const axiosInstance = axios.create(config)

4:发起请求前的处理

axiosInstance.interceptors.request.use((config) => {const token = getToken()if (token) {;(config.headers as AxiosRequestHeaders).Authorization = `Bearer ${token}`;(config.headers as AxiosRequestHeaders)['X-ECAPI-UserAgent'] = getUserAgent()}return config},(error) => {return Promise.reject(error)}
)

在发起请求前,添加headers,配置身份信息

在请求头部添加UserAgent:X-ECAPI-UserAgent

在使用Akamai的API时,通常需要设置X-ECAPI-UserAgent头部来标识API的调用者。这样做可以帮助Akamai识别是谁在调用API,并可能用于日志记录或者访问控制。

 5:接口返回值

// @TODO: 两处reject的reason做个包装,通过一个标识符,使得业务代码可以区分走的是哪个reject
axiosInstance.interceptors.response.use((res: AxiosResponse<BaseResponse>) => {console.log('router', router)console.log('location.href', location.href)if (res.data.code !== ResponseCode.Success) {// 2. HTTP状态码200,但业务code !== ResponseCode.Success, promise 会被 rejectif (res.data.code === ResponseCode.InvalidToken) {// 业务代码} else if (res.data.code === ResponseCode.appDisabled) {// 业务代码router.push('/404')} else {// 业务代码}return Promise.reject(res)}// 1. 当且仅当业务code === ResponseCode.Success的情况下, promise 才会被 resolvereturn res},(error: AxiosError) => {// 3. HTTP状态码非200 || 网络异常 || 其它未被捕获的错误, promise会被 rejectif (error.config && error.config.showMessageOnReject) {if (error.response?.status === 500) {Toast('服务异常,请稍后重试')} else {Toast('网络异常,请稍后重试')}}return Promise.reject(error)}
)

这里的ResponseCodeBaseResponse是项目自定义的类型限制,不是axios中内置的;

6:AbortController的简单介绍

这里有一个中止请求的方法,使用AbortController,在网上看到别人说的使用方法:

认识 AbortController控制器对象 及其应用-CSDN博客

案例

type EnhancedPromise<T> = Promise<T> & {abortController: AbortController
}export const get = (url: string, params: Recordable = {}, config?: AxiosRequestConfig) => {const controller = new AbortController()const promise = new Promise((resolve, reject) => {axiosInstance.get<BaseResponse, AxiosResponse<BaseResponse, Recordable>, Recordable>(url, {params,signal: controller.signal,...config,}).then((res) => {resolve(res)}).catch((err: AxiosError) => {reject(err)})}) as EnhancedPromise<AxiosResponse<BaseResponse, Recordable>>promise.abortController = controllerreturn promise
}export const post = (url: string, data: Recordable = {}, config?: AxiosRequestConfig) => {const controller = new AbortController()const promise = new Promise((resolve, reject) => {axiosInstance.post<BaseResponse, AxiosResponse<BaseResponse, Recordable>, Recordable>(url, data, {signal: controller.signal,...config,}).then((res) => {resolve(res)}).catch((err: AxiosError) => {reject(err)})}) as EnhancedPromise<AxiosResponse<BaseResponse, Recordable>>promise.abortController = controllerreturn promise
}

覆盖axios原有的post和get方法

7:使用

7.1 没有覆盖post和get方法的使用方式

使用axios原有的post和get方式发起请求

import request from '@/request'// 查询export const findCategoryTree = ({ categoryId = 0 }: Recordable) => {return request.post(`/manager`, { categoryId })}

7.2覆盖了post和get方法的使用方式 

import { get, post } from '@/http'
import { AxiosRequestConfig } from 'axios'// 短信验证码登录
export const signin = (data: Recordable, config?: AxiosRequestConfig) => {return post(`/member/login`, data, config)
}

8:typescript的介绍

axios提供的内置类型声明,查看路径node_modules/axios/index.d.ts

import axios, { AxiosRequestConfig, AxiosResponse, AxiosError, AxiosRequestHeaders } from 'axios'
  • AxiosResponse:接口响应值类型限制
  • AxiosError:接口响应失败情况下的类型限制处理

  • AxiosRequestHeaders 接口请求头类型限制

  • AxiosRequestConfig 接口请求的基本配置类型限制

简单记录下vue3 + axios + ts 的基本封装

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

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

相关文章

总结常见漏洞的代码审计方法

前言 这篇文章主要是总结一下在安全工作中常见漏洞的代码审计方法&#xff0c;以及修复方案&#xff0c;希望能对初学代码审计小伙伴们有所帮助&#xff0c;笔芯♥️ 代码审计的思路 通常做代码审计都是检查敏感函数的参数&#xff0c;然后回溯变量&#xff0c;判断变量是否可…

【Crypto】RSA

文章目录 题目步骤1.计算 &#x1d45b;2.计算欧拉函数 &#x1d719;(&#x1d45b;)3. 扩展欧几里得算法求逆元 &#x1d451; 解题感悟 题目 p473398607161 q4511491 e17 求d 步骤 1.计算 &#x1d45b; 公式&#xff1a;npq n47339860716145114912135733555619387051 …

初识STM32单片机-TIM定时器

初识STM32单片机-TIM定时器 一、定时器概述二、定时器类型2.1 基本定时器(TIM6和TIM7)2.2 通用定时器(TIM2、TIM3、TIM4和TIM5)2.3 高级定时器(TIM1和TIM8) 三、定时中断基本结构和时基单元工作时序3.1 定时器基本结构3.2 预分频器时序3.3 计数器时序3.3.1 计数器有无预装时序(…

ACM实训冲刺第二十一天

寒冰王座&#xff08;数据处理与逻辑判断&#xff09; 这段C语言代码实现了一个根据特定条件计算整数输入值变换的程序&#xff0c;它并不直接对应于经典的算法题类型&#xff0c;但可以视为一个“数据处理与逻辑判断”练习题。代码的主要逻辑如下&#xff1a; 读取测试数据数量…

electron-builder 打包配置

electron-builder介绍 一个完整的解决方案&#xff0c;用于打包和构建适用于macOS、Windows和Linux的可供分发的Electron应用程序&#xff0c;并提供开箱即用的“自动更新”支持。 命令 Commands: electron-builder build 构建 …

数据库设计分为几个阶段?

数据库设计可以分为以下几个阶段&#xff1a; 1.需求分析阶段&#xff1a;确定数据库的目标和需求&#xff0c;包括确定数据库的功能、数据量、访问模式、安全性等。 2.概念设计阶段&#xff1a;根据需求分析&#xff0c;设计出数据库的概念模型&#xff0c;包括实体、关系、…

Java学习52-迭代器 iterator

迭代器 iterator 迭代器Iterator的作用&#xff1f; 集合Collection是一个容器&#xff0c;是用来存储数据的。Iterator不是容器&#xff0c;是用来遍历现存的集合中的数据的。 2.如何选取迭代器Iterator对象&#xff1f; Iterator iterator coll.iterator(); 3.如何实现遍…

Hono 框架使用经验谈

Hono&#x1f525;是一个小型、快速并开源的 Serverless Web 框架&#xff0c;用 TypeScript 写就。它适用于任何JavaScript运行时&#xff1a;Cloudflare Workers&#xff0c;Fastly ComputeEdge&#xff0c;Deno&#xff0c;Bun&#xff0c;Vercel&#xff0c;Netlify&#x…

动手学操作系统(一、搭建实验环境)

动手学操作系统&#xff08;一、搭建实验环境&#xff09; 文章目录 动手学操作系统&#xff08;一、搭建实验环境&#xff09;1. 在VMware虚拟机中安装ubuntu20.042. 安装Bochs3. 启动计算机Reference &#x1f680; 环境配置 &#x1f680; 笔者的环境使用的是 ubuntu 20.04…

python多线程的使用

Python 多线程探索 在 Python 编程中&#xff0c;多线程是一项强大的技术&#xff0c;它允许我们同时执行多个任务&#xff0c;从而提高程序的效率和响应性。 一、线程的基本概念 线程是进程中的一个执行单元&#xff0c;可以与其他线程共享进程的资源。 二、创建线程 在 P…

HTML/JavaScript实现复制文本、复制HTML、复制图片功能

文章目录 复制文本复制HTML复制图片全代码 复制文本 navigator.clipboard.writeText 接收一个字符串参数&#xff0c;写入到剪贴板中。 <button onclick"copyText()">复制文本</button> <script> function copyText() {// navigator.clipboard.wri…

Linux:confluence8.5.9的部署(下载+安装+破ji)离线部署全流程

0.环境 Confluence也是比较吃运存了&#xff0c;我建议运行运存给到4g或者4g以上就可以了&#xff0c;核数可以给到1核或以上 我部署在centos7.9操作系统上&#xff0c;ip地址为&#xff1a;192.168.6.1&#xff0c;yum仓库使用的是自己的镜像文件&#xff0c;本章所有使用到…

爱普生XC1011SD为电气稳定控制系统组合式传感器推出解决方案

在现代电力系统中&#xff0c;确保系统的安全和稳定运行至关重要。为了应对这一需求&#xff0c;我们推出了XC1011SD组合式传感器解决方案&#xff0c;它专为电气稳定控制系统设计&#xff0c;提供了卓越的性能和可靠性。 XC1011SD是一款集成陀螺仪传感器和双轴加速度计于一体的…

炸裂!AI五分钟模仿爆款IP故事,涨粉速度太绝了!

‍ ‍大家好&#xff0c;我是向阳。 今天我要分享一个利用AI技术模仿爆款账号的小技巧&#xff0c;帮助大家迅速增加粉丝。这个方法简单实用&#xff0c;尤其适用于副业和本地生活领域。接下来&#xff0c;我将为大家详细讲解操作步骤。让我们开始吧。 副业赚钱&#xff1a;模…

合约构成-成员变量、函数、事件event、修饰器modifier及构造函数

合约的基本结构 合约中的成员变量合约中的成员函数Event&#xff08;事件&#xff09;、modifier(修饰器)与constructor&#xff08;构造函数:实例产生的时候执行&#xff09; Event事件 modifier construcor 1、成员变量 概念&#xff1a;存储合约状态的变量 声明方法&a…

北京证券公司港股通交易佣金手续费最低是多少?万0.8?港股通纳入规则是怎么样的?

港股通交易佣金概述 港股通的交易佣金可能会因证券公司和投资者的不同而有所差异。 北京证券公司的港股通交易佣金最低可能万分之零点八&#xff08;0.008%&#xff09;&#xff0c;但这需要投资者与证券公司客户经理了解&#xff0c;进行沟通和申请。 一般来说&#xff0c;…

git-将老项目的分支推送到新项目的新分支上

1.克隆新项目&#xff1a;首先&#xff0c;将新项目的仓库克隆到本地。使用以下命令将新项目克隆到本地&#xff1a; git clone <新项目的仓库地址> 2.进入新项目目录&#xff1a;进入新项目的目录&#xff0c;使用以下命令&#xff1a; cd <新项目目录> 3.添加旧项…

CSS学习笔记:Less

什么是Less&#xff1f; Less是一个CSS预处理器&#xff0c; Less文件后缀是.less 扩充了CSS 语言&#xff0c;使CSS具备一定的逻辑性、计算能力 可以通俗地理解&#xff1a;Less是一种更好用的CSS 注释 运算 嵌套 Less嵌套的作用&#xff1a;快速生成后代选择器 变量 问…

软考中级-软件设计师-真题详解【2023年上半年】

2023上半年真题记忆点详解 本片不涉及解题法&#xff0c;只整理记忆背诵点&#xff0c;记住即可拿分。 上午题部分&#xff1a; 片内总线&#xff1a;用于芯片内部各主要部件连接&#xff1b; 系统总线&#xff1a;用于CPU、主存、外设见的数据传输&#xff1b; 通讯总线&…

嵌入式LINUX开发成长计划

LINUX基础 嵌入式LINUX安装与环境配置完全指南-CSDN博客 基于ViutualBoxUbuntu(Linux)的开发环境搭建-CSDN博客 嵌入式LINUX常见符号与常用命令-CSDN博客 Git