一、原生 AJAX
1. AJAX 简介
AJAX
全称为 Asynchronous JavaScript And XML
,就是异步的 JS 和 XML
。
通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据
。
AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。
2.XML 简介
XML 可扩展标记语言。
XML 被设计用来传输和存储数据。
XML 和 HTML 类似,不同的是 HTML 中都是预定义标签,而 XML 中没有预定义标签,全都是自定义标签,用来表示一些数据。
比如说我有一个学生数据:name = “孙悟空” ; age = 18 ; gender = “男” ;
//用 XML 表示:
<student>
<name>孙悟空</name>
<age>18</age>
<gender>男</gender>
</student>
现在已经被 JSON 取代了。
//用 JSON 表示:
{"name":"孙悟空","age":18,"gender":"男"}
3.AJAX 的特点
⑴ AJAX 的优点
- 可以无需刷新页面而与服务器端进行通信。
- 允许你根据用户事件来更新部分页面内容。
⑵ AJAX 的缺点
- 没有浏览历史,不能回退
- 存在跨域问题(同源)
- SEO 不友好
4. AJAX 的使用
⑴ 前期准备
1) 安装node.js
2) 查看已安装的 Node.js 的版本号
# 打开终端,在终端输入命令 node –v 后,按下回车键,即可查看已安装的 Node.js 的版本号。
C:\Users\12137>node -v
Windows 系统快速打开终端的方式:
使用快捷键(Windows徽标键 + R
)打开运行面板,输入cmd
后直接回车,即可打开终端。
3) 使用express创建项目
使用命令初始化项目
npm init --yes
引入express包
npm i express
⑵ 核心对象
XMLHttpRequest
,AJAX 的所有操作都是通过该对象进行的。
/*
响应报文
行
HTTP/1.1 200 ok
头
Content-Type:text/html;charset=utf-8
Content-length:2048
Content-encoding:gzip
体
<html>
<head>
</head>
<body>
<h1>柯基侦探</h1>
</body>
</html>
*/
⑶ 使用步骤
1) 创建 XMLHttpRequest
对象
var xhr = new XMLHttpRequest();
2) 设置请求信息
xhr.open(method, url);
//可以设置请求头,一般不设置
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
3) 发送请求
xhr.send(body) //get 请求不传 body 参数,只有 post 请求使用
4) 接收响应
//xhr.responseXML 接收 xml 格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
if(xhr.readyState == 4 && xhr.status == 200){
var text = xhr.responseText;
console.log(text);
}
}
⑷ 解决 IE 缓存问题
问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址即可避免缓存问题
xhr.open("get","/testAJAX?t="+Date.now());
⑸ AJAX 请求状态
xhr.readyState
可以用来查看请求当前的状态
https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/readyState
0:
表示 XMLHttpRequest 实例已经生成,但是 open()方法还没有被调用。
1:
表示 send()方法还没有被调用,仍然可以使用 setRequestHeader(),设定 HTTP请求的头信息。
2:
表示 send()方法已经执行,并且头信息和状态码已经收到。
3:
表示正在接收服务器传来的 body 部分的数据。
4:
表示服务器数据已经完全接收,或者本次接收已经失败了
⑹ AJAX基本的请求案例一 ——发起不带参
的get请求
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX GET 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border:solid 1px #90b;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
//获取button元素
const btn = document.getElementsByTagName('button')[0];
const result = document.getElementById("result");
//绑定点击事件
btn.onclick = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化 设置请求方法和url
xhr.open('GET','http://127.0.0.1:8000/server');
//3.发送
xhr.send();
//4.事件绑定,处理服务器返回的结果
//on when 当...时候
//readystate 是xhr对象中的属性,表示状态0 1 2 3 4
/*
readyState属性是XMLHttpRequest对象的一个重要属性,用于标识当前请求的状态。这个属性有5个可能的值,它们分别代表请求的不同阶段:
0 - 未初始化:表示对象尚未调用send()方法。
1 - 载入:已调用send()方法,正在发送请求。
2 - 载入完成:send()方法执行完成,已经接收到全部响应内容。
3 - 交互:正在解析响应内容。
4 - 完成:响应内容解析完成,可以在客户端调用了。
这五个状态值提供了对HTTP请求从发送到接收响应整个过程的详细跟踪,使得开发者能够更好地控制和管理异步请求。
*/
//change 改变
xhr.onreadystatechange = function(){
//判断(服务端返回了所有的结果)
if(xhr.readyState === 4){
//判断响应状态码 200 404 403 401 500
//2XX 表示成功
if(xhr.status >= 200 && xhr.status < 300){
//处理结果 行 头 空行 体
//1.响应头
console.log(xhr.status);//状态码
console.log(xhr.statusText);//状态字符串
console.log(xhr.getAllResponseHeaders());//所有的响应头
console.log(xhr.response);//响应体
//设置result文本
result.innerHTML = xhr.response;
}else{
}
}
}
}
</script>
</body>
</html>
测试:
启动服务
⑺ AJAX基本的请求案例二 —— 发起带参的get请求
ajax
get请求传参可以直接在url后面拼接
url?参数1=参数1值&参数2=参数2值
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX GET 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border:solid 1px #90b;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
//获取button元素
const btn = document.getElementsByTagName('button')[0];
const result = document.getElementById("result");
//绑定点击事件
btn.onclick = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化 设置请求方法和url
xhr.open('GET','http://127.0.0.1:8000/server?userName=zs&age=18');
//3.发送
xhr.send();
//4.事件绑定,处理服务器返回的结果
//on when 当...时候
//readystate 是xhr对象中的属性,表示状态0 1 2 3 4
/*
readyState属性是XMLHttpRequest对象的一个重要属性,用于标识当前请求的状态。这个属性有5个可能的值,它们分别代表请求的不同阶段:
0 - 未初始化:表示对象尚未调用send()方法。
1 - 载入:已调用send()方法,正在发送请求。
2 - 载入完成:send()方法执行完成,已经接收到全部响应内容。
3 - 交互:正在解析响应内容。
4 - 完成:响应内容解析完成,可以在客户端调用了。
这五个状态值提供了对HTTP请求从发送到接收响应整个过程的详细跟踪,使得开发者能够更好地控制和管理异步请求。
*/
//change 改变
xhr.onreadystatechange = function(){
//判断(服务端返回了所有的结果)
if(xhr.readyState === 4){
//判断响应状态码 200 404 403 401 500
//2XX 表示成功
if(xhr.status >= 200 && xhr.status < 300){
//处理结果 行 头 空行 体
//1.响应头
console.log(xhr.status);//状态码
console.log(xhr.statusText);//状态字符串
console.log(xhr.getAllResponseHeaders());//所有的响应头
console.log(xhr.response);//响应体
//设置result文本
result.innerHTML = xhr.response;
}else{
}
}
}
}
</script>
</body>
</html>
测试:
启动服务
⑻ AJAX基本的请求案例三——发起不带参的post请求
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX POST 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border: solid 1px #903;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
//获取元素对象
const result = document.getElementById("result");
//绑定事件
result.addEventListener('mouseover',function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化,设置类型与url
xhr.open('POST','http://127.0.0.1:8000/server');
//3.发送请求
xhr.send();
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//处理服务器端返回的结果
result.innerHTML = xhr.response;
}
}
}
});
</script>
</body>
</html>
测试:
启动服务
⑼ AJAX基本的请求案例四 —— 发起带参的post请求
1) 发起带有请求体的post请求
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX POST 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border: solid 1px #903;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
//获取元素对象
const result = document.getElementById("result");
//绑定事件
result.addEventListener('mouseover',function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化,设置类型与url
xhr.open('POST','http://127.0.0.1:8000/server');
//3.发送请求
// xhr.send('username=zs&age=19');
//xhr.send('username:zs&age:19');
xhr.send('柯基侦探微信公众号');
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//处理服务器端返回的结果
result.innerHTML = xhr.response;
}
}
}
});
</script>
</body>
</html>
测试:
启动服务
2) 发起带有请求头的post请求
请求报文的格式
行:
POST /s?ie=uft-8 HTTP/1.1
头:
Host:kejizhentan.com
Cookie:name=kejizhentan
Content-type:application/x-www-form-urlencoded
User-Agent:chrome 83
空行:
体:
username=admin&password=123456
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX POST 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border: solid 1px #903;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
//获取元素对象
const result = document.getElementById("result");
//绑定事件
result.addEventListener('mouseover',function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化,设置类型与url
xhr.open('POST','http://127.0.0.1:8000/server');
//设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//3.发送请求
// xhr.send('username=zs&age=19');
//xhr.send('username:zs&age:19');
xhr.send('柯基侦探微信公众号');
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//处理服务器端返回的结果
result.innerHTML = xhr.response;
}
}
}
});
</script>
</body>
</html>
测试:
启动服务
⑽ AJAX基本的请求案例五 ——服务端响应json数据
1) 手动转换json数据
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
app.post('/json-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//响应一个数据
const data = {
name:"柯基侦探"
};
//对对象进行字符串转换
let str = JSON.stringify(data);
//设置响应体
response.send(str);
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX POST 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border: solid 1px #89b;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
//获取元素对象
const result = document.getElementById("result");
//绑定事件
window.onkeydown = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化,设置类型与url
xhr.open('POST','http://127.0.0.1:8000/json-server');
//3.发送请求
xhr.send();
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//手动对数据进行转换
let data = JSON.parse(xhr.response);
//处理服务器端返回的结果
result.innerHTML = data.name;
}
}
}
}
</script>
</body>
</html>
测试:
启动服务
2) 自动转换json数据
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
app.post('/json-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//响应一个数据
const data = {
name:"柯基侦探"
};
//对对象进行字符串转换
let str = JSON.stringify(data);
//设置响应体
response.send(str);
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX POST 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border: solid 1px #89b;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
//获取元素对象
const result = document.getElementById("result");
//绑定事件
window.onkeydown = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//设置响应体数据的类型
xhr.responseType = 'json';
//2.初始化,设置类型与url
xhr.open('POST','http://127.0.0.1:8000/json-server');
//3.发送请求
xhr.send();
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//处理服务器端返回的结果,自动转换json格式
result.innerHTML = xhr.response.name;
}
}
}
}
</script>
</body>
</html>
测试:
启动服务
⑾ nodemon自动重启工具安装
nodemon工具介绍: https://www.npmjs.com/package/nodemon
安装命令:
npm install -g nodemon
⑿ AJAX请求超时和网络异常
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
app.post('/json-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//响应一个数据
const data = {
name:"柯基侦探"
};
//对对象进行字符串转换
let str = JSON.stringify(data);
//设置响应体
response.send(str);
});
app.get('/delay',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
setTimeout(()=>{
//设置响应体
response.send('延迟响应~');
},3000);
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX GET 请求</title>
<style>
#result{
width: 200px;
height: 100px;
border:solid 1px #90b;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
//获取button元素
const btn = document.getElementsByTagName('button')[0];
const result = document.getElementById("result");
//绑定点击事件
btn.onclick = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//超时设置2s
xhr.timeout=2000;
//超时回调
xhr.ontimeout = function(){
alert("请求超时,请稍后重试");
}
//网络异常
xhr.onerror = function(){
alert("网络异常,家里断网啦~");
}
//2.初始化 设置请求方法和url
xhr.open('GET','http://127.0.0.1:8000/delay');
//3.发送
xhr.send();
//change 改变
xhr.onreadystatechange = function(){
//判断(服务端返回了所有的结果)
if(xhr.readyState === 4){
//判断响应状态码 200 404 403 401 500
//2XX 表示成功
if(xhr.status >= 200 && xhr.status < 300){
//处理结果 行 头 空行 体
//1.响应头
//设置result文本
result.innerHTML = xhr.response;
}else{
}
}
}
}
</script>
</body>
</html>
测试:
启动服务
⒀ AJAX取消请求
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
app.post('/json-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//响应一个数据
const data = {
name:"柯基侦探"
};
//对对象进行字符串转换
let str = JSON.stringify(data);
//设置响应体
response.send(str);
});
app.get('/delay',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
setTimeout(()=>{
//设置响应体
response.send('延迟响应~');
},3000);
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX 请求取消</title>
</head>
<body>
<button>点击发送</button>
<button>点击取消</button>
<script>
//获取元素对象
const btns = document.querySelectorAll('button');
let x = null;
//发起请求
btns[0].onclick = function(){
x = new XMLHttpRequest();
x.open("GET",'http://127.0.0.1:8000/delay');
x.send();
}
//取消请求
btns[1].onclick = function(){
x.abort();
}
</script>
</body>
</html>
测试:
启动服务
⒁ AJAX请求重复发送问题
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
app.post('/json-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//响应一个数据
const data = {
name:"柯基侦探"
};
//对对象进行字符串转换
let str = JSON.stringify(data);
//设置响应体
response.send(str);
});
app.get('/delay',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
setTimeout(()=>{
//设置响应体
response.send('延迟响应~');
},3000);
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX 请求取消</title>
</head>
<body>
<button>点击发送</button>
<script>
//获取元素对象
const btns = document.querySelectorAll('button');
let x = null;
//标识变量
let isSending = false;//是否正在发送ajax请求
//发起请求
btns[0].onclick = function(){
//判断标识变量
if(isSending) x.abort();//如果正在发送请求,则取消该请求,创建一个新的请求
x = new XMLHttpRequest();
//修改标识变量的值
isSending = true;
x.open("GET",'http://127.0.0.1:8000/delay');
x.send();
x.onreadystatechange = function(){
if(x.readyState === 4){
//修改标识变量
isSending = false;
}
}
}
</script>
</body>
</html>
测试:
启动服务
二、jQuery 中的 AJAX
1. jQuery 中 使用ajax 发送get 请求
$.get(url, [data], [callback], [type])
url:请求的 URL 地址。
data:请求携带的参数。
callback:载入成功时回调函数。
type:设置返回内容格式,xml, html, script, json, text, _default。
2. jQuery 中 使用ajax 发送 post 请求
$.post(url, [data], [callback], [type])
url:请求的 URL 地址。
data:请求携带的参数。
callback:载入成功时回调函数。
type:设置返回内容格式,xml, html, script, json, text, _default。
3.jQuery 中 使用ajax 发送请求的通用格式
$.ajax({
url: 'your-endpoint-url', // 目标URL
type: 'GET', // 请求类型,可以是GET、POST、PUT、DELETE等
dataType: 'json', // 预期服务器返回的数据类型
data: {param1: 'value1', param2: 'value2'}, // 发送到服务器的数据
beforeSend: function(xhr) {
// 发送请求前可以在这里做些什么,例如设置自定义HTTP头部
},
success: function(response) {
// 请求成功时的回调函数
console.log(response);
},
error: function(xhr, status, error) {
// 请求失败时的回调函数
console.log(error);
},
complete: function(xhr, status) {
// 请求完成时的回调函数(无论成功或失败)
}
});
3. jQuery发送AJAX请求案例
server.js
//1.引入express
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX');
});
app.post('/server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send('HELLO AJAX POST');
});
app.post('/json-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
//响应一个数据
const data = {
name:"柯基侦探"
};
//对对象进行字符串转换
let str = JSON.stringify(data);
//设置响应体
response.send(str);
});
app.get('/delay',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
setTimeout(()=>{
//设置响应体
response.send('延迟响应~');
},3000);
});
app.all('/jquery-server',(request,response)=>{
//设置响应
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*');
let data = {"usename":"柯基侦探"}
response.send(JSON.stringify(data));
});
//4.监听端口启动服务
app.listen(8000,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header">jQuery发送AJAX请求</h2>
<button class="btn btn-primary">GET</button>
<button class="btn btn-danger">POST</button>
<button class="btn btn-info">通用型方法</button>
</div>
<script>
$('button').eq(0).click(function () {
$.get("http://127.0.0.1:8000/jquery-server", { "username": "zs", "age": 18 }, function (data) {
console.log(data);
}, 'json');
});
$('button').eq(1).click(function () {
$.post("http://127.0.0.1:8000/jquery-server", { "username": "zs", "age": 18 }, function (data) {
console.log(data);
});
});
$('button').eq(2).click(function () {
$.ajax({
url: 'http://127.0.0.1:8000/jquery-server', // 目标URL
type: 'GET', // 请求类型,可以是GET、POST、PUT、DELETE等
dataType: 'json', // 预期服务器返回的数据类型
data: { username: 'zhangsan', age: 18 }, // 发送到服务器的数据
beforeSend: function (xhr) {
// 发送请求前可以在这里做些什么,例如设置自定义HTTP头部
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
},
success: function (data) {
// 请求成功时的回调函数
console.log("通用ajax请求响应的结果:",data);
},
error: function (xhr, status, error) {
// 请求失败时的回调函数
console.log("出错了~");
},
complete: function (xhr, status) {
// 请求完成时的回调函数(无论成功或失败)
console.log("请求完成了~");
}
});
});
</script>
</body>
</html>
测试:
启动服务
三、Axios发送AJAX请求
点击连接访问 https://www.bootcdn.cn/
1. axios 的理解和使用
⑴ axios 是什么?
- 前端最流行的 ajax 请求库
- react/vue 官方都推荐使用 axios 发 ajax 请求
- 文档: https://github.com/axios/axios
⑵ axios 特点
- 基于
xhr + promise
的异步 ajax 请求库 - 浏览器端/node 端都可以使用
- 支持请求/响应拦截器
- 支持请求取消
- 请求/响应数据转换
- 批量发送多个请求
⑶ axios 常用语法
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(promises): 用于批量执行多个异步请求
axios.spread(): 用来指定接收所有成功数据的回调函数的方法
2. axios 基本使用
axios(config): 通用/最本质的发任意类型请求的方式
server.js
//1.引入express
const express = require('express');
const cors = require('cors');
//2.创建应用对象
const app = express();
// 使用cors中间件
app.use(cors())
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应体
response.send('HELLO AXIOS GET');
});
app.post('/server',(request,response)=>{
//设置响应体
response.send('HELLO AXIOS POST');
});
app.put('/server',(request,response)=>{
//设置响应体
response.send('HELLO AXIOS PUT');
});
app.delete('/server',(request,response)=>{
//设置响应体
response.send('HELLO AXIOS DELETE');
});
//4.监听端口启动服务
app.listen(8888,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.5/axios.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header">axios基本使用</h2>
<button class="btn btn-primary">发送GET请求</button>
<button class="btn btn-danger">发送POST请求</button>
<button class="btn btn-info">发送PUT请求</button>
<button class="btn btn-info">发送DELETE请求</button>
</div>
<script>
//获取按钮
const btns = document.querySelectorAll('button');
//模拟发送GET请求
//发送GET的按钮
btns[0].onclick = function(){
//发送AXIOS请求
axios({
//请求类型
method:'GET',
//请求的URL
url:'http://127.0.0.1:8888/server?username=kejizhentan',
}).then(response=>{
console.log(response);
});
}
//模拟发送POST请求
//发送POST请求的按钮
btns[1].onclick = function(){
//发送axios请求
axios({
//请求类型
method:'POST',
//请求的URL
url:'http://127.0.0.1:8888/server',
//设置请求体
data:{
username:"柯基侦探",
age:7
}
}).then(response=>{
console.log(response);
});
}
//模拟发送PUT请求
//发送PUT请求的按钮
btns[2].onclick = function(){
//发送axios请求
axios({
//请求类型
method:'PUT',
//请求的URL
url:'http://127.0.0.1:8888/server',
//设置请求体
data:{
username:"张三",
age:18
}
}).then(response=>{
console.log(response);
});
}
//模拟发送DELETE请求
//发送DELETE请求的按钮
btns[3].onclick = function(){
//发送axios请求
axios({
//请求类型
method:'DELETE',
//请求的URL
url:'http://127.0.0.1:8888/server'
}).then(response=>{
console.log(response);
});
}
</script>
</body>
</html>
测试:
启动服务
3. axios.request请求方式介绍
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 请求
server.js
//1.引入express
const express = require('express');
const cors = require('cors');
//2.创建应用对象
const app = express();
// 使用cors中间件
app.use(cors())
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
//设置响应
//设置响应体
response.send('HELLO AXIOS GET');
});
app.post('/server',(request,response)=>{
//设置响应体
response.send('HELLO AXIOS POST');
});
app.put('/server',(request,response)=>{
//设置响应体
response.send('HELLO AXIOS PUT');
});
app.delete('/server',(request,response)=>{
//设置响应体
response.send('HELLO AXIOS DELETE');
});
//4.监听端口启动服务
app.listen(8888,()=>{
console.log('服务已启动,8000端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.5/axios.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header">axios基本使用</h2>
<button class="btn btn-primary">发送GET请求</button>
<button class="btn btn-danger">发送POST请求</button>
<button class="btn btn-info">发送PUT请求</button>
<button class="btn btn-info">发送DELETE请求</button>
</div>
<script>
//获取按钮
const btns = document.querySelectorAll('button');
//模拟发送GET请求
//发送GET的按钮
btns[0].onclick = function(){
//发送AXIOS请求
axios.request({
//请求类型
method:'GET',
//请求的URL
url:'http://127.0.0.1:8888/server?username=kejizhentan',
}).then(response=>{
console.log(response);
});
}
//模拟发送POST请求
//发送POST请求的按钮
btns[1].onclick = function(){
//发送axios请求
axios.post(
//请求的URL
'http://127.0.0.1:8888/server',
//设置请求体
{
username:"柯基侦探",
age:7
}
).then(response=>{
console.log(response);
});
}
//模拟发送PUT请求
//发送PUT请求的按钮
btns[2].onclick = function(){
//发送axios请求
axios({
//请求类型
method:'PUT',
//请求的URL
url:'http://127.0.0.1:8888/server',
//设置请求体
data:{
username:"张三",
age:18
}
}).then(response=>{
console.log(response);
});
}
//模拟发送DELETE请求
//发送DELETE请求的按钮
btns[3].onclick = function(){
//发送axios请求
axios({
//请求类型
method:'DELETE',
//请求的URL
url:'http://127.0.0.1:8888/server'
}).then(response=>{
console.log(response);
});
}
</script>
</body>
</html>
测试:
启动服务
4. axios 配置对象说明
{
// 请求的url
url: '/user',
//请求方法,如GET, POST, PUT, DELETE等
method: 'get', // default
// 设置请求的基础URL
baseURL: 'https://some-domain.com/api/',
// 请求数据转换函数(可选)
transformRequest: [function (data, headers) {
return data;
}],
//响应数据转换函数(可选)
transformResponse: [function (data) {
return data;
}],
// 请求头(对象形式)
headers: {'X-Requested-With': 'XMLHttpRequest'},
//请求参数对象
params: {
ID: 12345
},
// 自定义参数序列化函数(可选)
paramsSerializer: {
//Custom encoder function which sends key/value pairs in an iterative fashion.
encode?: (param: string): string => { /* Do custom operations here and return transformed string */ },
// Custom serializer function for the entire parameter. Allows user to mimic pre 1.x behaviour.
serialize?: (params: Record<string, any>, options?: ParamsSerializerOptions ),
//Configuration for formatting array indexes in the params.
indexes: false // Three available options: (1) indexes: null (leads to no brackets), (2) (default) indexes: false (leads to empty brackets), (3) indexes: true (leads to brackets with indexes).
},
//请求体数据
data: {
firstName: 'Fred'
},
// 请求超时时间(毫秒)
timeout: 1000, // default is `0` (no timeout)
// 是否携带凭证(如cookies)进行跨域请求(可选)
withCredentials: false, // default
// 自定义请求适配器(可选)
adapter: function (config) {
/* ... */
},
//基本认证凭据(用户名和密码)
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
// 响应数据类型,如json、arraybuffer、blob、document、text等
responseType: 'json', // default
// 响应数据编码,如 'utf8', 'UTF8', 'utf16le', 'UTF16LE'
responseEncoding: 'utf8', // default
// 用作CSRF令牌的cookie的名称
xsrfCookieName: 'XSRF-TOKEN', // default
// 用于放置CSRF令牌的HTTP头的名称
xsrfHeaderName: 'X-XSRF-TOKEN', // default
// 上传进度事件(可选)
onUploadProgress: function ({loaded, total, progress, bytes, estimated, rate, upload = true}) {
// Do whatever you want with the Axios progress event
},
// 下载进度事件(可选)
onDownloadProgress: function ({loaded, total, progress, bytes, estimated, rate, download = true}) {
// Do whatever you want with the Axios progress event
},
// 允许的最大http内容长度
maxContentLength: 2000,
//自定义HTTP响应状态码验证函数(可选)
validateStatus: function (status) {
return status >= 200 && status < 300; // default
},
// 最大重定向次数
maxRedirects: 21, // default
}
5. axios的默认配置
Axios Config Defaults 是指通过 axios.defaults.xxx
设置 axios 的默认配置
//axios.defaults.baseURL: 设置 axios 请求的基础 URL,在发送请求时如果 URL 不是绝对路径,就会使用 baseURL。
axios.defaults.baseURL = 'https://api.example.com';
//axios.defaults.headers.common: 设置通用的请求头。
axios.defaults.headers.common['Authorization'] = 'AUTH_TOKEN';
//axios.defaults.timeout: 设置请求超时时间。
axios.defaults.timeout = 1000;
//axios.defaults.adapter: 设置自定义的请求适配器。
axios.defaults.adapter = function (config) {
/* 自定义适配器的逻辑 */
};
//axios.defaults.validateStatus: 设置判定请求响应状态码的函数。
axios.defaults.validateStatus = function (status) {
return status >= 200 && status < 300; // 默认的判定逻辑
};
//axios.defaults.transformRequest: 设置请求数据的转换函数。
axios.defaults.transformRequest = [function (data) {
/* 转换请求数据的逻辑 */
}];
//axios.defaults.transformResponse: 设置响应数据的转换函数。
axios.defaults.transformResponse = [function (data) {
/* 转换响应数据的逻辑 */
}];
server.js
//1.引入express
const express = require('express');
const cors = require('cors');
//2.创建应用对象
const app = express();
// 使用cors中间件
app.use(cors())
//3.创建路由规则
//request 是对请求报文的封装
app.get('/server',(request,response)=>{
console.log(request);
//设置响应体
response.send('HELLO AXIOS GET');
});
//4.监听端口启动服务
app.listen(8888,()=>{
console.log('服务已启动,8888端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.5/axios.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header"> axios的默认配置</h2>
<button class="btn btn-primary">发送GET请求</button>
</div>
<script>
//获取按钮
const btns = document.querySelectorAll('button');
//默认设置
axios.defaults.method = 'GET';//设置默认的请求为get
axios.defaults.baseURL = 'http://127.0.0.1:8888';//设置基础URL
axios.defaults.params = {username:"柯基侦探"};
axios.defaults.timeout=3000;
//模拟发送POST请求
//发送POST请求的按钮
btns[0].onclick = function(){
//发送axios请求
axios({
url:'/server'
}
).then(response=>{
console.log(response);
});
}
</script>
</body>
</html>
测试:
启动服务
6. axios创建实例对象发送请求
server.js
//1.引入express
const express = require('express');
const cors = require('cors');
//2.创建应用对象
const app = express();
// 使用cors中间件
app.use(cors())
//3.创建路由规则
//request 是对请求报文的封装
app.get('/server',(request,response)=>{
console.log(request);
//设置响应体
response.send('HELLO AXIOS GET');
});
//4.监听端口启动服务
app.listen(8888,()=>{
console.log('服务已启动,8888端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.5/axios.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header"> axios创建实例对象发送请求</h2>
<button class="btn btn-primary">发送GET请求</button>
</div>
<script>
//获取按钮
const btns = document.querySelectorAll('button');
//创建实例对象
const kjzt = axios.create({
baseURL: 'http://127.0.0.1:8888',
timeout: 2000
});
//这里的kjzt对象跟axios对象几乎是一样的功能
btns[0].onclick = function () {
kjzt({
//请求类型
method:'GET',
url: '/server'
}).then(response => {
console.log(response);
});
}
</script>
</body>
</html>
测试:
启动服务
7. axios拦截器
server.js
//1.引入express
const express = require('express');
const cors = require('cors');
//2.创建应用对象
const app = express();
// 使用cors中间件
app.use(cors())
//3.创建路由规则
//request 是对请求报文的封装
app.get('/server',(request,response)=>{
console.log(request);
//设置响应体
response.send('HELLO AXIOS GET');
});
//4.监听端口启动服务
app.listen(8888,()=>{
console.log('服务已启动,8888端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.5/axios.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header"> axios创建实例对象发送请求</h2>
<button class="btn btn-primary">发送GET请求</button>
</div>
<script>
//设置请求拦截器
axios.interceptors.request.use(function (config) {
console.log('请求拦截器 成功 -1!');
return config;
}, function (error) {
console.log('请求拦截器 失败-1!');
return Promise.reject(error);
});
//设置请求拦截器
axios.interceptors.request.use(function (config) {
console.log('请求拦截器 成功-2!');
return config;
}, function (error) {
console.log('请求拦截器 失败-2!');
return Promise.reject(error);
});
// 设置响应拦截器
axios.interceptors.response.use(function (response) {
console.log('响应拦截器 成功-1!');
return response;
}, function (error) {
console.log('响应拦截器 失败-1!');
return Promise.reject(error);
});
// 设置响应拦截器
axios.interceptors.response.use(function (response) {
console.log('响应拦截器 成功-2!');
return response;
}, function (error) {
console.log('响应拦截器 失败-2!');
return Promise.reject(error);
});
//发送请求
//获取按钮
const btns = document.querySelectorAll('button');
//模拟发送GET请求
//发送GET的按钮
btns[0].onclick = function(){
//发送AXIOS请求
axios({
//请求类型
method:'GET',
//请求的URL
url:'http://127.0.0.1:8888/server',
}).then(response=>{
console.log('自定义回调处理成功的结果!');
}).catch(response=>{
console.log('自定义回调处理失败的结果');
});
}
</script>
</body>
</html>
测试:
启动服务
- 说明: 调用 axios()并不是立即发送 ajax 请求, 而是需要经历一个较长的流程
- 流程: 请求拦截器2 => 请求拦截器1 => 发ajax请求 => 响应拦截器1 => 响
应拦截器 2 => 请求的回调- 注意: 此流程是通过 promise 串连起来的, 请求拦截器传递的是 config, 响应
拦截器传递的是 response
8. axios取消请求
⑴ 基本流程
配置 cancelToken
对象
缓存用于取消请求的 cancel
函数
在后面特定时机调用 cancel
函数取消请求
在错误回调中判断如果 error 是 cancel, 做相应处理
⑵ 实现功能
点击按钮, 取消某个正在请求中的请求,在请求一个接口前, 取消前面一个未完成的请求
⑶ axios取消请求和防止重复请求的案例
server.js
//1.引入express
const express = require('express');
const cors = require('cors');
//2.创建应用对象
const app = express();
// 使用cors中间件
app.use(cors())
//3.创建路由规则
//request 是对请求报文的封装
app.get('/server',(request,response)=>{
console.log(request);
//设置延迟三秒后响应
setTimeout(()=>{
//设置响应体
response.send('HELLO AXIOS GET');
},3000);
});
//4.监听端口启动服务
app.listen(8888,()=>{
console.log('服务已启动,8888端口监听中...');
});
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 发送 AJAX 请求</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.5/axios.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header"> axios创建实例对象发送请求</h2>
<button class="btn btn-primary">发送GET请求</button>
<button class="btn btn-danger">取消请求</button>
</div>
<script>
//获取按钮
const btns = document.querySelectorAll('button');
//2.声明全局变量
let cancel = null;
//发送请求
btns[0].onclick = function () {
//检测上一次请求是否已完成
if(cancel !== null){
//取消上一次的请求
cancel();
}
axios({
method: 'GET',
url: 'http://127.0.0.1:8888/server',
//1.添加配置对象的属性
cancelToken: new axios.CancelToken(c => {
//3.将参数赋值给全局变量cancel
cancel = c;
})
}).then(response => {
console.log(response);
//将cancel 的值初始化
cancel = null;
});
}
//给第二个按钮 绑定取消请求
btns[1].onclick = function () {
cancel();
}
</script>
</body>
</html>
测试:
启动服务
四、跨域
1. 同源策略
同源策略(Same-Origin Policy)最早由 Netscape 公司提出,是浏览器的一种安全策略。
同源: 协议、域名、端口号 必须完全相同。
违背同源策略就是跨域。