axios
拦截器 接口封装
大纲链接 §
[toc]
1. axios
接口封装概述 ⇧
安装略,引入axios
⇧
import axios from 'axios'
,后代码中略
处理加载页面效果 ⇧
- 在请求拦截器和响应式拦截器中根据记录的 正在发起的请求数 来处理
- 请求拦截器
axios.interceptors.request.use()
- 响应式拦截器
axios.interceptors.response.use()
二次封装axios
的目的 ⇧
- 由于业务根据不同的功能模块,划分为不同的
url
前缀,所以需要二次封装axios
- 根据功能模块配置不同的
axios
配置
主动取消请求的场景 ⇧
- 搜索框 需要防止 用户输入每次一变化,就向服务端发送一次请求
- 用户输入过快 前端用 debounce(如延时 200ms 发请求),连续输入间隔小于 200ms,之前的输入都不会发请求
- 而当 后端接口很慢(如超 1s )之前的请求没有响应前,也有可能发出去多个请求
- 先后两次请求
A -> B
,B
响应后发而先至,前面请求响应结果,覆盖后面请求响应结果的情况 - 除了做 debounce,后发请求时,之前请求未响应,可以把前面的请求取消
全局配置 axios
⇧
- 自定义请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- 将配置和调用解耦,将一些相关配置配置成常量后在引入使用
- 创建
env.ts
设置并导出配置常量BASE_URL
和TIME_OUT
- 基本请求公共路径
axios.defaults.baseURL = BASE_URL;
- 超时时间
axios.defaults.timeout = TIME_OUT;
- 创建
- 或者使用环境配置文件
.env.*
Vite
在一个特殊的import.meta.env
对象上暴露环境变量Vue-CLI
是基于webpack
,它是在process.env
上挂载的- 比如
.env.development
设置VITE_APP_BASE_API='https://blog-server.hunger-valley.com'
- 使用时,在js源代码文件中通过
import.meta.env.VITE_xxx
来访问,类似vue/cli
中的process.env.VUE_APP_BASE_URL
也可以通过创建实例,在创建时配置属性,以配置公共路径为例:
- 调用
axios.create
方法创建实例 和 对该实例的拦截器interceptors
方法进行重写,在此基础上添加取消重复请求的功能 const http = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_URL, });
- 然后使用实例
http.interceptors.request.use(/* ... */)
http.interceptors.request.use(/* ... */)
export default http;
参考
axios
接口封装 ⇧
axios
取消重复请求 的封装axios
响应错误后 重试请求 的封装token
失效返回登录页面 的封装
参考
2. axios
请求拦截器 ⇧
|
|
3. axios
响应拦截器 ⇧
|
|
4. 实现 axios
取消普通请求 ⇧
对普通的
XMLHttpRequest
请求进行取消,用到了实例的abort()
方法
|
|
取消
axios
请求
- 使用
axios
的cancelToken
方法 - 获取实例
const source = axios.CancelToken.source()
- 在
config
中写入属性cancelToken: source.token
- 取消请求
source.cancel()
|
|
5. axios
功能的二次封装 ⇧
axios
取消重复请求 的封装axios
响应错误后 重试请求 的封装token
失效返回登录页面 的封装
通用代码,后略
|
|
axios
取消重复请求 的封装 ⇧
实现思路
- 针对多个重复请求发送
- 先后紧接着发送了两个相同的请求,对前一个请求进行取消操作,真正发送出去的是后一个
- 判断请求重复
- 通过 请求的地址
url
- 通过 请求方式
method
- 请求参数
params | data
这几个值来做唯一判断 - 如果两个请求上的这些信息都相同,那么就可以判断这两个请求是重复的
- 通过 请求的地址
- 获取 这个请求的
cancel
方法,调用cancel
方法进行取消- 把当前请求和对应的
cancel
进行关联 - 用对象、数组或者
Map
进行存储- 把当前请求的信息作为
key
- 把对应的
cancel
方法作为value
- 存储到对象或者
Map
中
- 把当前请求的信息作为
- 根据当前请求信息,获取到对应的取消方法
- 每一个请求的
cancel
方法需要调用new CancelToken()
才可以获取
- 每一个请求的
- 把当前请求和对应的
在页面离开时,丢弃所有未完成的请求 使用
AbortController
- 访问一个请求会消耗比较长时间的页面,如果此时切换到其它页面,这些未完成的请求会影响下个页面的数据载入
- 也就是说,下面页面中的请求会在前一个页面请求完成后才执行
原理简述
- 页面中创建一个
AbortControlller
的实例 - 在所有有可能需要结束请求的
config
里,添加signal: abortController.sinal
这个选项 - 当离开页面的时候,使用
abortController.abort()
结束所有的请求即可
使用数组 和 AbortController
实现 ⇧
- 请求列表
reqList
- 删除重复请求的方法
rmSameReq
- 通过判断
reqList
中是否有相同method
和url
的项 - 若重复 则调用该项中的
reqList[index].controller.abort()
方法 取消请求 - 当
abort()
被调用时,这个 promise 将 reject 一个名为 AbortError 的 DOMException
- 通过判断
|
|
使用 Map
+ axios.CancelToken
实现,略 ⇧
额外封装一个
CancelRequest
类,导出,供拦截器实现使用
|
|
参考
- MDN AbortController
- axios 官方取消请求的说明
- axios请求封装(取消重复请求)
- 不要再被误导了,封装 Axios 只看这一篇文章就行了
- 使用函数代替拦截器
- 支持请求重试
- 支持 jsonp 请求
- 支持 URI 版本控制
- 保持请求唯一
- 真没必要再对 axios 进行过度的封装
- Axios中文文档 取消请求
axios
响应错误后 重试请求 的封装 ⇧
|
|
token
失效 返回登录页面 的封装 ⇧
|
|
参考
6. axios
另一种取消请求功能… ⇧
需要为该请求配置一个
cancelToken
,然后在外部调用一个cancel
方法
CancelToken
废弃了,故略
参考
- CancelToken deprecated
- axios之cancelToken取消多次重复请求
- axios.CancelToken 前端取消请求与取消重复请求
- axios.CancelToken 请求终极封装【取消重复请求,请求失败自动重试,请求接口数据缓存】
- axios.CancelToken 前端应该如何封装高扩展的axios请求库?我是怎么动态控制axios的
- axios.CancelToken Axios封装之取消重复请求和接口缓存
- axios.CancelToken Axios 如何取消重复请求?
- Axios使用cancel token取消请求后,无法再次发送请求的问题及解决思路
- axios.CancelToken axios中取消请求及阻止重复请求的方法
- axios.CancelToken 取消功能的设计与实现 看评论
7. axios
接口封装在Vue
中的应用 ⇧
原理回顾
- 页面中创建一个
AbortControlller
的实例 - 在所有有可能需要结束请求的
config
里,添加signal: abortController.sinal
这个选项 - 当离开页面的时候,使用
abortController.abort()
结束所有的请求即可
vue
代码
|
|
- 在离开这个页面的时,都会丢弃所有添加了
signal
的请求,不管页面中有没有未完成的请求,不会影响下一个页面的数据请求
封装到原型上
2.x 全局 API(Vue) | 3.x 实例 API (app) |
---|---|
Vue.prototype |
app.config.globalProperties |
参考
- vue 在页面离开时,丢弃所有未完成的请求 AbortController signal / CancelToken.cancel 取消请求
- 40张图全面剖析Vue3核心的CompositionAPI(十四)
- vue3.2 + vite + vant + pinia + ts 移动端 h5 项目新手实践 之 封装 Axios
8. axios
封装为hooks
⇧
9. axios
接口封装总结 ⇧
参考文章 ⇧
相关文章 ⇧
- Axios 作弊表(Cheat Sheet)
- axios请求的一些常见操作
- 当我们对组件二次封装时我们在封装什么
- 我发现了axios源码工具函数中的一个小bug
- 40张图全面剖析Vue3核心的CompositionAPI(十四)
- vue3.2 + vite + vant + pinia + ts 移动端 h5 项目新手实践 Axios封装
VueRequest 系列周边
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名