1 axios是什么
前端最流行的 ajax请求库, https://gitcode.net/mirrors/axios/axios?utm_source=csdn_github_accelerator
- 基于promise的异步ajax请求库
- 浏览器端/node端都可以使用
- 支持请求/响应拦截器
- 支持请求取消
- 请求/响应数据转换
- 批量发送多个请求
2 json-server的介绍与服务搭建
git: https://gitcode.net/mirrors/typicode/json-server?utm_source=csdn_github_accelerator
json-server 详解:https://blog.csdn.net/namechenfl/article/details/120885849
全局安装json-server:npm install -g json-server
创建json文件,内容是:
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
在该文件目录下运行:json-server --watch db.json
查看id为1的页面在http://localhost:3000.posts/1
其中, /1就是id
3 axios常用语法及基本安装
axios安装:npm install axios
vue项目使用
在main.js
import axios from 'axios'
Vue.prototype.$ajax = axios
html 直接导入就行了:
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.2/axios.min.js"></script>
</head>
4 axios 的基本使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.2/axios.min.js"></script>
</head>
<body>
<div>
<h2>axios基本使用</h2>
<button> 发送GET请求</button>
<button> 发送POST请求</button>
<button> 发送 PUT 请求</button>
<button> 发送 DELETE 请求</button>
</div>
<script>
// 获取按钮
const btns = document.querySelectorAll('button');
// 第一个按钮 发送GET请求
btns[0].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'GET',
// URL
url: 'http://localhost:3000/posts/1',
}).then(response => {
console.log(response);
});
}
// 第二个按钮 发送POST请求 添加一篇新的文章
btns[1].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'POST',
// URL
url: 'http://localhost:3000/posts',
// 设置请求体
data: {
title: "今天天气很好",
author: "王五"
}
}).then(response => {
console.log(response);
});
}
// 第三个按钮 发送PUT请求 更新数据
btns[2].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'PUT',
// URL
url: 'http://localhost:3000/posts/3',
// 设置请求体
data: {
title: "今天天气很好",
author: "赵六"
}
}).then(response => {
console.log(response);
});
}
// 第四个按钮 发送DELETE请求 删除数据
btns[3].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'delete', // 大小写都可以
// URL
url: 'http://localhost:3000/posts/3',
}).then(response => {
console.log(response);
});
}
</script>
</body>
</html>
默认get请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.2/axios.min.js"></script>
</head>
<body>
<div>
<h2>axios基本使用</h2>
<button> 发送GET请求</button>
<button> 发送POST请求</button>
<button> 发送 PUT 请求</button>
<button> 发送 DELETE 请求</button>
</div>
<script>
// 获取按钮
const btns = document.querySelectorAll('button');
// 第一个按钮 发送GET请求
btns[0].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'GET',
// URL
url: 'http://localhost:3000/posts/1',
}).then(response => {
console.log(response);
});
}
</script>
</body>
</html>
对于**axios({})**返回值的理解,其返回的是一个Promise对象
btns[0].onclick = function () {
// 发送AJAX请求
let promise = axios({
// 请求类型
method: 'GET',
// URL
url: 'http://localhost:3000/posts/1',
});
console.log(promise)
}
post
// 第二个按钮 发送POST请求 添加一篇新的文章
btns[1].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'POST',
// URL
url: 'http://localhost:3000/posts',
// 设置请求体
data: {
title: "今天天气很好",
author: "王五"
}
}).then(response => {
console.log(response);
});
}
put
// 第三个按钮 发送PUT请求 更新数据
btns[2].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'PUT',
// URL
url: 'http://localhost:3000/posts/3',
// 设置请求体
data: {
title: "今天天气很好",
author: "赵六"
}
}).then(response => {
console.log(response);
});
}
delete
// 第四个按钮 发送DELETE请求 删除数据
btns[3].onclick = function () {
// 发送AJAX请求
axios({
// 请求类型
method: 'delete', // 大小写都可以
// URL
url: 'http://localhost:3000/posts/2',
}).then(response => {
console.log(response);
});
}
5 axios 其他方式发送请求
<script>
// 获取按钮
const btns = document.querySelectorAll('button');
// 第一个按钮 发送GET请求
btns[0].onclick = function () {
// 与axios()使用方式一样
axios.request({
method: 'GET',
url: 'http://localhost:3000/comments'
}).then(response => {
console.log(response);
});
}
// 第二个按钮 发送POST请求 添加一个新的评论
btns[1].onclick = function () {
axios.post('http://localhost:3000/comments',
{
"body": "我是一条评论",
"postId": 2
}).then(response => {
console.log(response);
});
}
</script>
6 axios请求响应结果的结构
config:配置对象
data:响应体的结果
headers:响应头的信息
request:原生的AJAX请求对象
axios配置对象详细说明
- url: 往哪发送请求
- method: 用什么发
- baseURL :设定url的基础结构
- transFormRequest :相应完后的预处理
- headers: 对请求头信息进行处理
- params:设定URL 的参数 例如 post?a=100&b=200
1、axios调用的返回值是Promise实例
2、成功的值叫response 失败的值叫error
3、axios成功的值是一个axios封装的response对象,服务器返回的真正数据在response.data中
4、携带query参数时,编写的配置项叫params
5、携带params参数时,需要自己手动在拼在url中
7 axios默认配置
每写一个请求都要写一遍url路径太麻烦了,为了对重复代码的编写,可以提前设定好配置用axios.defaults
<script>
// 获取按钮
const btns = document.querySelectorAll('button')
// 设置默认配置
axios.defaults.methods = 'GET' //设置默认的请求类型为 get
axios.defaults.baseURL = 'http://localhost:3000' //设置基础 URL
axios.defaults.params = {id: 100}
axios.defaults.timeout = 3000
btns[0].onclick = function () {
axios({
url: '/posts',
}).then(response => {
console.log(response);
})
}
</script>
8 axios创建实例对象发送请求
<script>
const comments = axios.create({
baseURL: 'http://localhost:3000/',
timeout: 2000
});
const profile = axios.create({
baseURL: 'http://localhost:3000/profile',
timeout: 2000
});
comments({
url:'comments'
}).then(resp => {
console.log('resp', resp);
})
====等同于如下结果===
comments.get('comments').then(resp => {
console.log('resp', resp);
})
</script>
9 axios 拦截器
拦截器相当于函数,分为两大类(请求拦截器、相应拦截器)
请求前给数据和内容做一些检测,如果请求没有什么问题就可以请求
当服务器返回结果前:先对结果做一些预处理(格式化处理、记录…)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.2/axios.min.js"></script>
</head>
<body>
<div>
<h2>axios基本使用</h2>
<button> 发送GET请求</button>
<button> 发送POST请求</button>
<button> 发送 PUT 请求</button>
<button> 发送 DELETE 请求</button>
</div>
<script>
axios.interceptors.request.use(config => {
console.log('request interceptors success')
return config
}, error => {
console.log('request interceptors error')
return Promise.reject(error)
})
axios.interceptors.response.use(response => {
console.log('response interceptors success')
return response
}, error => {
console.log('response interceptors error')
return Promise.reject(error)
})
axios({
method: 'GET',
url: 'http://localhost:3000/posts'
}).then(response => {
console.log('response', response)
})
</script>
</body>
</html>
流程: 请求拦截器2 => 请求拦截器1 => 发ajax请求 => 响应拦截器1 => 响应拦截器 2 => 请求的回调
多个请求拦截器后添加后的执行顺序
多个响应拦截器后添加后的执行顺序
如果请求拦截发现问题了:
响应拦截器:对结果做处理
10 取消请求
- 配置 cancelToken 对象
- 缓存用于取消请求的 cancel 函数
- 在后面特定时机调用 cancel 函数取消请求
- 在错误回调中判断如果 error 是cancel ,做相应处理
1 点击按钮, 取消某个正在请求中的请求
2 在请求一个接口前, 取消前面一个未完成的请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.2/axios.min.js"></script>
</head>
<body>
<div>
<h2>axios基本使用</h2>
<button> 发送GET请求</button>
<button> 发送POST请求</button>
<button> 发送 PUT 请求</button>
<button> 发送 DELETE 请求</button>
</div>
<script>
<!-- 获取按钮-->
const btn = document.querySelectorAll('button')
//声明全局变量
let cancel = null;
btn[0].onclick = function () {
//检测上一次的请求是否已经完成
if (cancel !== null) {
//取消上一次的请求
cancel();
}
axios({
method: 'GET',
url: 'http://localhost:3000/posts',
cancelToken: new axios.CancelToken(flag => {
cancel = flag
})
}).then(Response => {
console.log(Response)
//将cancel的值初始化
cancel = null;
})
}
//绑定第二个事件取消请求
btn[1].onclick = function () {
cancel();
}
</script>
</body>
</html>