axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken)

2023-11-08

axios是什么

  1. 前端最流行的 ajax请求库
  2. react/vue官方推荐使用axios发ajax请求
  3. 文档 https://github.com/axios/axios

axios特点

  1. 基于promise的异步ajax请求库
  2. 浏览器端/node端都可以使用
  3. 支持请求/响应拦截器
  4. 支持请求取消
  5. 请求/响应数据转换
  6. 批量发送多个请求

axios中文文档

http://www.axios-js.com/

axios常用语法

nam value
axios(config) 通用/最本质的发任意类型请求的方式
axios(url[,config]) 可以只指定url发get请求
axios.request(config) 等同于axios(config)
axios.get(url[,config]) 发get请求
axios.delete(url[,config]) 发delete请求
axios.post(url[,data,config]) 发post请求
axios.put(url[,data,config]) 发put请求
axios.defaults.xxx 请求非默认全局配置
axios.interceptors.request.use() 添加请求拦截器
axios.interceptors.response.use() 添加响应拦截器
axios.create([config]) 创建一个新的axios(他没有下面的功能)
axios.Cancel() 用于创建取消请求的错误对象
axios.CancelToken() 用于创建取消请求的token对象
axios.isCancel() 是否是一个取消请求的错误
axios.all(promise) 用于批量执行多个异步请求

axios安装

npm install axios

vue项目使用
在main.js

import axios from 'axios'
Vue.prototype.$ajax = axios

html 直接导入就行了

<script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>

axios简单使用

默认get请求

// 配置默认基本路径
axios.defaults.baseURL = 'http://localhost:3000'

// 默认get请求
axios({
	url:"/posts",
	params:{
		id:1
	}
}).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

post

// post请求
axios.post("/posts",{id:1}).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

// 或

axios({
	url:"/posts",
	method:'post'
	data:{
		id:1
	}
}).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

put

axios.put("/posts/4",{
      "title": "json-server---1",
      "author": "typicode",
    }).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

// 或
axios({
	url:"/posts",
	method:'put '
	data:{
      "title": "json-server---1",
      "author": "typicode",
    }
}).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

delete

axios.delete("/posts/4",{
      "title": "json-server---1",
      "author": "typicode",
    }).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

// 或
axios({
	url:"/posts",
	method:'delete'
	data:{
		id:1
	}
}).then(res=>{
	console.log(res)
},err=>{
    console.log(err)
})

axios难点语法

axios.create(config) 对axios请求进行二次封装

  1. 根据指定配置创建一个新的 axios ,也就是每个axios 都有自己的配置
  2. 新的 axios 只是没有 取消请求批量请求 的方法,其它所有语法都是一致的
  3. 为什么要这种语法?
    1. 需求,项目中有部分接口需要的配置与另一部分接口的配置不太一样
    2. 解决:创建2个新的 axios ,每个都有自己的配置,分别对应不同要求的接口请求中

简单使用

const instance = axios.create({
   baseURL:"http://localhost:3000"
})

// 使用instance发请求
instance({
    url:"/posts"
})

// 或
instance.get("/posts")

在这里插入图片描述
同时请求 多个端口号

const instance = axios.create({
    baseURL:"http://localhost:3000"
})

const instance2 = axios.create({
    baseURL:"http://localhost:4000"
})

// 同时请求 端口号 3000 4000

// 使用instance发请求
instance({
    url:"/posts"
})

// 使用instance2发请求
instance2({
    url:"/posts"
})

axios的处理链流程 拦截器

拦截器简单使用
// 添加请求拦截器
axios.interceptors.request.use(config=>{
	// config 请求配置
	
	// 可用于
	// 发送网络请求时,在界面显示一个请求的同步动画
	// 某些请求(比如登录(token))必须携带一些特殊的信息
	
	// 请求成功拦截
    console.log("请求拦截器")
    return config
},err=>{
	// 请求失败拦截
    return Promise.reject(err)
})  

// 添加响应拦截器
axios.interceptors.response.use(res=>{
	// res 响应结果
	// 响应拦成功拦截
    console.log("响应拦截器")
    return res
},err=>{
	// 响应拦失败拦截
    return Promise.reject(err)
})  

console.log("开始请求")
axios.get("http://localhost:3000/posts")
.then(res=>{
    console.log("res:",res)
    console.log("请求结束")
})

在这里插入图片描述

多个拦截器

请求拦截器后添加先执行

// 添加请求拦截器
axios.interceptors.request.use(config=>{
    console.log("请求拦截器")
    return config
},err=>{
    return Promise.reject(err)
})  

axios.interceptors.request.use(config=>{
    console.log("请求拦截器--------2")
    return config
},err=>{
    return Promise.reject(err)
})  

axios.interceptors.request.use(config=>{
    console.log("请求拦截器--------3")
    return config
},err=>{
    return Promise.reject(err)
})  


// 添加响应拦截器
axios.interceptors.response.use(res=>{
    console.log("响应拦截器")
    return res
},err=>{
    return Promise.reject(err)
})  

axios.interceptors.response.use(res=>{
    console.log("响应拦截器---------2")
    return res
},err=>{
    return Promise.reject(err)
}) 

axios.interceptors.response.use(res=>{
    console.log("响应拦截器----------3")
    return res
},err=>{
    return Promise.reject(err)
})

console.log("开始请求")
axios.get("http://localhost:3000/posts")
.then(res=>{
    console.log("res:",res)
    console.log("请求结束")
})

在这里插入图片描述

取消请求

1. 基本流程
配置 cancelToken 对象
缓存用于取消请求的 cancel 函数
在后面特定时机调用 cancel 函数取消请求
在错误回调中判断如果 error 是cancel ,做相应处理
2. 实现功能

node运行server.js
安装node和express (npm install express)

var http = require("http");

var express = require("express")
// var server = http.createServer();
var app = express()

// node跨域设置
app.all("*",function(req,res,next){
    //设置允许跨域的域名,*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin","*");
    //允许的header类型
    res.header("Access-Control-Allow-Headers","content-type");
    //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS");
    if (req.method.toLowerCase() == 'options')
        res.send(200);  //让options尝试请求快速结束
    else
        next();
})


app.get('/',function(res,req){
    console.log("获取客户端请求",res);
    // 延迟响应 方便测试取消接口
    setTimeout(function(){
        req.end("延迟响应 方便测试取消接口"); //响应客户数据
    },5000)
    
})

app.listen(4000,function(){
    console.log("服务器启动成功,可以通过 http://127.0.0.1:4000 进行访问")
})

在cmd窗口

node server.js

调用接口测试
axios.isCancel(err) //判断错误是否 是取消请求导致的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
</head>
<body>
    <script>
        let cancel;

        // axios({
        //     url:"http://localhost:4000",
        //     cancelToken:new axios.CancelToken(function(c){
        //         cancel = c
        //     })
        // })
        // 或

        axios.get("http://localhost:4000",{
            cancelToken:new axios.CancelToken(function(c){
                // c 用于取消当前请求的函数
                cancel = c
            })
        })
        .then(res=>{
            console.log("res:",res)
            cancel = null //请求完成,清空cancel
        },err=>{
            cancel = null 
            if(err.constructor.name === 'Cancel'){ //是取消请求导致的errer
                console.log("取消请求导致error:",err)
            }else{
                console.log("err:",err)
            }
			// 或
            // axios.isCancel(err) //判断错误是否 是取消请求导致的
        });

        setTimeout(function(){
            if(typeof(cancel) === 'function'){
                cancel('强制取消了请求')
            }else{
                console.log("没有可取消的请求")
            }
        },2000)
    </script>
</body>
</html>

正常请求
在这里插入图片描述
取消接口

在这里插入图片描述

在 请求拦截器里面统一添加取消请求
axios.interceptors.request.use(res=>{
  	res['cancelToken'] = new axios.CancelToken(function(c){
        cancel = c
    })
    return res
},err=>{
    return Promise.reject(err)
}) 
在 响应拦截器里面统一添加 处理取消请求
axios.interceptors.response.use(res=>{
  
    return res
},err=>{
	if(axios.isCancel(err)){
		// 中断promise链接
		return new Promise(()=>{})
	}else{
		// 把错误继续向下传递
    	return Promise.reject(err)
	}
}) 
代码简化 实现上一个接口还未响应 下一个接口开始请求,把上一个接口取消
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
</head>
<body>
    <script>
        let cancel;

        axios.interceptors.request.use(config=>{
            // 实现上一个接口还未响应  下一个接口开始请求,把上一个接口取消
            if(typeof(cancel) === 'function'){
                cancel('强制取消了请求')
            }
            config['cancelToken'] = new axios.CancelToken(function(c){
                cancel = c
            })
            return config
        },err=>{
            return Promise.reject(err)
        }) 

        axios.interceptors.response.use(res=>{
            cancel = null 
            return res
        },err=>{
            cancel = null 
            if(axios.isCancel(err)){
                console.log("取消上一个请求")
                // 中断promise链接
                return new Promise(()=>{})
            }else{
                // 把错误继续向下传递
                return Promise.reject(err)
            }
        })  
        function request(){
            axios.get("http://localhost:4000")
            .then(res=>{
                console.log("res:",res)
            },err=>{
                console.log("err:",err)
            });
        }
        
        request()
        request()
    </script>
</body>
</html>

在这里插入图片描述

请求前/后数据处理

// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
transformRequest:[function (data, headers) {
    // 对 data 进行任意转换处理
    return data;
}],

// 在传递给 then/catch 前,允许修改响应数据
transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    return data;
}],
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken) 的相关文章

  • 无法在 JavaScript for 循环中读取 null 的属性“长度”

    我正在尝试制作一个像 Stack Overflow 那样的 Markdown 编辑器 如果我实际上没有在文本区域中键入星号和包含短语的 http 我会收到标题中列出的此错误 如果我只输入包含星号的短语 则错误指的是这一行 if linkif
  • pubnub 和 head.js

    有没有人成功整合过pubnub http www pubnub com 和 head js 正确吗 Pubnub http www pubnub com 希望我将他们的脚本放在页面底部并带有 div 就在它前面的标签 这可以确保在最后调用
  • 在 Javascript 中获取第一个数字出现后的子字符串

    我正在尝试提取第一个数字之后 并包括 的字符 ABC 123SD gt 123SD 123 gt 123 123SD gt 123SD ABC gt 我当前的解决方案如下 var string1 ABC 123SD var firstDig
  • 定义 js-xlsx 单元格范围

    我正在尝试使用 js xlsx 读取 Excel 值 我可以使用以下代码从工作簿工作表中获取单元格值 if typeof require undefined XLSX require xlsx var workbook XLSX readF
  • 如何防止 gulp-notify 破坏 Windows 中的 gulp-watch?

    我正在使用吞咽通知 https www npmjs org package gulp notify插入 这是我如何在 gulpfile js 中实现它的示例 您可以看到我也在使用 gutil 和 livereload 我不知道它们是否发挥任
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 循环遍历元素并逐步为每个元素应用 CSS 规则

    我有一个网格布局 每个网格布局中都有不同数量的元素 我想动态添加内联grid column通过循环遍历 div 中存在的每个元素的 CSS 规则 ul 与一类 list 所以 HTML 代码的输出需要是 ul class list ul u
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • IE 中的每个 JavaScript 支持?

    我有这个代码
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • Internet Explorer 9 是否会因数组和对象文字末尾的额外逗号而卡住?

    现代浏览器和 Node js 等环境允许您说 a 1 b 2 或 1 2 3 这在历史上一直是 Internet Explorer 的问题 Internet Explorer 9 中修复了此问题吗 对此有两种不同的答案 一种是对象初始值设定

随机推荐

  • NSIS简介

    1 简介 NSIS是一款帮助开发者创建Windows安装包的工具 NSIS通过NSIS脚本语言 NSIS Script 来配置安装过程中的信息 通过灵活的脚本方式 NSIS可以实现从最简单的文件拷包制作 到需要读写注册表 配置环境变量 以及
  • 局部变量错误

    参考 局部变量错误 云 社区 腾讯云 解析 UnboundLocalError local variable xxx referenced before assignment 在函数外部已经定义了变量n 在函数内部对该变量进行运算 运行时会
  • 计算机新代理大会优美句子,描写计算机教室的优美句子

    描写计算机教室的英语作文六句话怎么写 教室有两扇玻璃门 外边有鞋柜 教室两边各有一台空调 中间是三列 每列有20台电脑老师讲台上有一张桌子 桌子后面有一个大的放映屏幕天花板上有白色灯管 一共有9盏教室有8扇窗户教室里有52张凳子In eac
  • 利用docker 搭建File Browser 文件管理系统

    File Browser就是一个文件浏览器 因为linux并不方便桌面管理 所以Filebrowser就是帮助我们管理linux服务器上文件的程序 你可以称他为网盘程序 可以管理文件 可以分享文件 另外它还可以在线播放 mp4视频 下载fi
  • 云安全技术——执行ifconfig命令提示command not found

    安装完centOS 7 执行ifconfig命令提示command not found 解决办法 查找环境标量是否包含ifconfig 如下图 显示环境变量没有ifconfig 2 执行 yum search ifconfig 查找ifco
  • python mysql connection_Python MySQL连接访问

    将python应用程序连接到数据库有以下步骤 导入mysql connector模块 创建连接对象 创建游标对象 执行查询 创建连接 要在MySQL数据库和python应用程序之间创建连接 请使用mysql connector模块的conn
  • Python绘图系统10:在父组件中使用子组件的函数

    文章目录 Combobox绑定事件 互相调用 源代码 Python绘图系统 从0开始实现一个三维绘图系统 自定义控件 坐标设置控件 坐标列表控件 支持多组数据的绘图系统 图表类型和风格 散点图和条形图 混合类型图表 Combobox绑定事件
  • PMIC驱动之—PMIC硬件相关知识

    PMIC 电源管理集成电路 Power Management IC 在之前项目中 驱动最小系统 对于PMIC这块儿很懵懂 故抽时间查看一些优秀博文及资料 加强对电源管理的理解 本文介绍 PMIC 硬件电路相关的一些知识 在此作一些阶段性的学
  • 负载均衡入门

    提纲 ADC 行业现状 ADC 原理 ADC 的实现方式 为什么是 ADC 而不是负载均衡 功能的扩展 解决了什么问题 可用性 Availability 伸缩性 Scalability 性能 End user performance 数据中
  • Java-类什么时候被加载

    类什么时候被加载 类加载时机 生成该类对象的时候 会加载该类及该类的所有父类 访问该类的静态成员的时候 class forName 类名 加载完以后JVM中就有了该类的元数据 知道这个Class的成员变量和方法等信息 当要new一个类的实例
  • AIO, DIO, CIO

    复杂度3 5 机密度3 5 这些名词都用于数据 文件 访问的模式 既应用程序用什么方案实现对文件的读写 AIO AIO 的全称为 Asynchronous I O 既异步 I O 在 AIO 的工作模式下 应用程序发起 call I O请求
  • 动态封装对象,属性来自json

    需求 如何动态的获取一个对象的字段 假如一个对象里面有name age sex三个字段 我想取name的值 这个name是存在一个json中 json的格式如下 key name key age key sex 先遍历这个json 然后再根
  • golang struct 详解

    转载自 https juejin im post 6844903814168838151 Go Struct超详细讲解 原创作者 公众号 程序员读书 欢迎关注公众号 转载文章请注明出处哦 Go语言中提供了对struct的支持 struct
  • Ubuntu 通用命令大全

    查看目录 ls 用不同颜色 经过排列的文本列出目录下的文件 不包括隐藏文件 ls a 列出当前路径下的所有文件 ls l 列出当前目录下可见文件的详细信息 包括用户权限 建立用户 建立时间 占用空间等 返回上一级 cd 上级目录名称 在终端
  • c语言获取linux下cpu、mem、disk信息

    linux下的路径 cpu proc stat mem proc meminfo define ULL unsigned long long define SET IF DESIRED x y if x x y static int fiv
  • 13、计算学生总评成绩并排序(友元函数)

    问题描述 问题描述 试定义一个实现计算学生课程成绩的类Student 对学生学期总评成绩进行计算并排序 具体要求如下 1 私有数据成员 int norm ex final overall 分别表示学生的平时成绩 实验成绩 期末考试和总评成绩
  • 【CTF/MISC】一道图片隐写题

    图片隐写 题目 解题思路 binwalk工具查看是否有隐藏信息 foremost工具提取文件 zip2john工具对压缩包进行暴力破解 010editer工具查看图片的二进制数据 base64在线编码和解码 解题心得 题目连接 题目 题目是
  • AWS SAA C003 #29

    A company provides a Voice over Internet Protocol VoIP service that uses UDP connections The service consists of Amazon
  • vue+element+axios实现分页

    之前更了一个react的分页效果 今天给大家发一个vue写的分页 先在全局main js中引入element并使用 import ElementUI from element ui import element ui lib theme c
  • axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken)

    目录 axios是什么 axios特点 axios中文文档 axios常用语法 axios安装 axios简单使用 默认get请求 post put delete axios难点语法 axios create config 对axios请求