参考文档:https://gitee.com/hongjilin/hongs-study-notes/blob/master/%E7%BC%96%E7%A8%8B_%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Ajax%E3%80%81Axios%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Axios%E5%85%A5%E9%97%A8%E4%B8%8E%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E7%AC%94%E8%AE%B0.md
1. json-server
json-server用于模拟服务端接口数据, 可以根据json数据建立一个完整的web服务。
参考文档:https://blog.csdn.net/weixin_39415598/article/details/122035661
1.1 安装json-server
安装:npm install -g json-server
查看版本号: json-server -v
1.2 创建db.json
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
1.3 启动json-serve
2. axios是什么
Axios,是一个基于promise的网络请求库, 作用域node.js和浏览器中, 同一套代码可以运行在浏览器和node.js中。在服务端它使用原生的node.js模块, 而在客户端(浏览器)则使用XMLHttpRequest。
Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中。
Axios本质上也是对XHR的封装, 只不过它是Promise的实现版本, 符合最新的ES规范。
3. axios的特点
- 从浏览器创建XMLHttpRequests
- 从node.js创建http请求
- 支持Promise API
- 拦截请求和响应
- 转换请求和响应数据
- 取消请求
- 自动转换JSON数据
-
4. axios常用方法
4.1 get
const btn = document.querySelectorAll('button')
btn[0].onclick = function() {
axios({
method: 'GET',
url: 'http://localhost:3000/posts',
}).then((res) => {
console.log(res.data)
})
}
4.2 post
btn[1].onclick = function() {
axios({
method: 'POST',
url: 'http://localhost:3000/profile',
data:[
{name:'IRIC'},
{name:'OPPO'}
]
}).then((res) => {
console.log(res.data)
})
}
4.3 PUT
btn[2].onclick = function () {
axios({
method: 'PUT',
url: 'http://localhost:3000/posts/3',
data: {
id: 3,
title: 'REact',
author: 'node',
},
}).then((res) => {
console.log(res.data)
})
}
4.4 DELETE
btn[3].onclick = function () {
axios({
method: 'DELETE',
url: 'http://localhost:3000/posts/3',
}).then((res) => {
console.log(res.data)
})
}
5. 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(): 用来指定接收所有成功数据的回调函数的方法 ```javascript //get btn[0].onclick = () => { axios.request({
method: 'GET',
url: 'http://localhost:3000/posts',
}).then(res => {
console.log(res)
}) }
btn[0].onclick = () => { axios.get(‘http://localhost:3000/posts',).then(res => {
console.log(res.data)
}) }
//post btn[0].onclick = () => { axios.post(‘http://localhost:3000/profile',{
name:"test"
}).then(res => {
console.log(res.data)
}) }
<a name="yzmXX"></a>
## 5.1 axios config参数配置
```javascript
const config = {
url: '/user', //请求地址
method: 'get', // default 请求类型
baseURL: 'https://some-domain.com/api/', //baseUrl基础路径
transformRequest: [function (data, headers) { //对请求数据做处理, 把处理后的结果向服务器发送
return data;
}],
transformResponse: [function (data) { //对响应结果做一些处理,
return data;
}],
headers: {'X-Requested-With': 'XMLHttpRequest'},//设置头信息
params: { //设定URL参数,
ID: 12345
},
paramsSerializer: { //对请求的参数做序列化, 转化为字符串
indexes: null
},
data: { //请求体设置 有2种形式 1.对象形式2. 字符串形式
firstName: 'Fred'
},
data: 'Country=Brasil&City=Belo Horizonte',
timeout: 1000, // default is `0` (no timeout) //超时时间
withCredentials: false, // default
adapter: function (config) {
/* ... */
},
auth: { //请求基础验证
username: 'janedoe',
password: 's00pers3cret'
},
responseType: 'json', // default
responseEncoding: 'utf8', // default
xsrfCookieName: 'XSRF-TOKEN', // default 安全设置
xsrfHeaderName: 'X-XSRF-TOKEN', // default 安全设置
onUploadProgress: function (progressEvent) { //上传时的回调
},
onDownloadProgress: function (progressEvent) {//下载时的回调
},
maxContentLength: 2000,
maxBodyLength: 2000,
validateStatus: function (status) {
return status >= 200 && status < 300; // default
},
maxRedirects: 21, // default 最大跳转次数
beforeRedirect: (options, { headers }) => {
if (options.hostname === "example.com") {
options.auth = "user:password";
}
},
socketPath: null, // default socket路径
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
proxy: {//代理
protocol: 'https',
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
},
cancelToken: new CancelToken(function (cancel) {
}),
signal: new AbortController().signal,
decompress: true, // default
insecureHTTPParser: undefined, // default
transitional: {
silentJSONParsing: true, // default value for the current Axios version
forcedJSONParsing: true,
clarifyTimeoutError: false,
},
env: {
FormData: window?.FormData || global?.FormData
},
formSerializer: {
visitor: (value, key, path, helpers)=> {}; // custom visitor funaction to serrialize form values
dots: boolean; // use dots instead of brackets format
metaTokens: boolean; // keep special endings like {} in parameter key
indexes: boolean; // array indexes format null - no brackets, false - empty brackets, true - brackets with indexes
}
}
5.2 原理图
5.3 axios.create(config)
- 根据指定配置创建一个新的axios, 也就是每个新axios都有自己的配置;
- 新axios只是没有取消和批量发送请求的方法, 其他所有语法都是一致的;
- 这个语法的作用:
- 需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一样,如何处理?
- 解决: 创建2个新axiso,每个都有自己特有的配置, 分别应用到不同要求的接口请求中。
//创建实例对象 /getJoke
const duanzi = axios.create({
baseURL: 'https://api.apiopen.top',
timeout: 2000
});
const onather = axios.create({
baseURL: 'https://b.com',
timeout: 2000
});
//这里 duanzi 与 axios 对象的功能几近是一样的
// duanzi({
// url: '/getJoke',
// }).then(response => {
// console.log(response);
// });
duanzi.get('/getJoke').then(response => {
console.log(response.data)
})
5.4 配置默认的配置
```javascript //默认配置 axios.defaults.method = ‘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); }) }
<a name="YpVnk"></a>
# 6. 请求拦截与请求响应
:::success
1. 说明: 调用**axios()**并不是立即发送**ajax**请求, 而是需要经过一个较长的**流程**
2. 流程: 请求拦截器2 =》 请求拦截器1=》响应拦截器1=》响应拦截器2 =》请求的回调
3. 注意: 此流程是通过**promise串联**起来的, 请求**拦截器**的是**config**, **响应拦截器**的是**response**
:::
```javascript
<script>
const btn = document.querySelectorAll('button')
axios.interceptors.request.use(
(config) => {
console.log('请求拦截成功---1号')
return config
},
(error) => {
console.log('请求拦截失败---1号')
}
)
axios.interceptors.response.use(
(res) => {
console.log('响应拦截成功---1号')
console.log(res)
return res
},
(error) => {
console.log('响应拦截器失败 ----1号', error)
}
)
axios.defaults.tomeout = 3000
btn[0].onclick = () => {
axios.get('http://localhost:3000/posts').then((res) => {
console.log(res)
})
}
</script>
7. 取消请求
- 基本流程 cancelToken对象
- 缓存用于取消请求的cancel函数
- 在后面特定时机调用cancel函数取消请求
- 在错误回调中判断如果error是cancel,做相应处理
- 实现功能,点击按钮,取消某个蒸菜请求中的请求
- 实现功能点击按钮,取消某个正在请求中的请求
const btn = document.querySelectorAll('button')
let cancel = null //声明全局变量
//发送请求
btn[0].onclick = () => {
console.log(1231321)
//判断上一次的请求是否已经完成
if (cancel !== null) {
cancel()
}
axios({
method: 'GET',
url: 'http://localhost:3000/posts',
// 1. 添加配置对象的属性
cancelToken: new axios.CancelToken((c) => {
//2.将c的值赋值给cancel
cancel = c
}),
}).then((res) => {
//将cancel的值初始化
cancel = null
console.log(res)
})
}
如果存在未完成的请求, 继续请求的时候, 会把上一次的 请求取消掉。