axios学习笔记 | 字数总计: 3.8k | 阅读时长: 17分钟 | 阅读量:
axios学习笔记 视频来源:黑马
笔记参考:努力学习的汪
学习时间:2022年2月28日
1 预备工具 1.1 安装 json-server
可用于模拟后端。
1 npm install -g json-server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 { "post" : [ { "id" : 1 , "title" : "json-server" , "author" : "typicode" }, { "id" : 2 , "title" : "Mark " author": " typicode" } ], " comments": [ { " id": 1, " body": " some comment", " postId": 1 } ], " profile": { " name": " typicode" } }
1 json-server --watch db.json
注意事项
在执行上面的命令时,可能会报以下错误:
1 无法加载文件 json-server.ps1,因为在此系统上禁止运行脚本。
解决办法:
1 2 get-ExecutionPolicy set-ExecutionPolicy RemoteSigned
1.2 使用 服务启动后,我们可以以Rest的方式请求这些地址:
例如获取id为2的post数据,可访问接口:http://localhost/post/2
2 axios的理解与使用 2.1 概述 2.1.1 axios是什么
前端最流行的 ajax 请求库
react/vue 官方都推荐使用 axios 发 ajax 请求
文档: https://github.com/axios/axios
2.1.2 axios特点
基于 xhr
(XMLHttpRequest
) + promise
的异步 ajax 请求库
浏览器端/node 端都可以使用
支持请求/响应拦截器
支持请求取消
请求/响应数据转换
批量发送多个请求
2.1.3 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.1.4 原理图
2.2 基本使用 2.2.1 安装 有多种方式安装axios:
1 <script src ="https://cdn.bootcdn.net/ajax/libs/axios/0.26.0/axios.js" > </script >
1 <script src ="https://cdn.bootcdn.net/ajax/libs/axios/0.26.0/axios.min.js" > </script >
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Document</title > <script src ="https://cdn.bootcdn.net/ajax/libs/axios/0.26.0/axios.js" > </script > </head > <body > <script > console .log(axios); </script > </body > </html >
2.2.2 发送不同类型的请求 对应常用语法的第1条。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Document</title > <script src ="https://cdn.bootcdn.net/ajax/libs/axios/0.26.0/axios.js" > </script > <link href ="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.1/css/bootstrap.min.css" rel ="stylesheet" > </head > <body > <div class ="container" > <h2 class ="page-header" > 基本使用</h2 > <button class ="btn btn-primary" > 发送GET请求</button > <button class ="btn btn-warning" > 发送POST请求</button > <button class ="btn btn-success" > 发送PUT请求</button > <button class ="btn btn-danger" > 发送DELETE请求</button > </div > <script > const btns = document .querySelectorAll("button" ); </script > </body > </html >
发送GET请求
代码
1 2 3 4 5 6 7 8 9 10 11 12 btns[0 ].onclick = function ( ) { axios({ method : "GET" , url : "http://localhost:3000/posts/2" }).then(response => { console .log(response); }); };
响应信息
发送POST请求:例如新增一个文档
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 btns[1 ].onclick = function ( ) { axios({ method : "POST" , url : "http://localhost:3000/posts" , data : { title : "Today" , author : "Hongyi" } }).then(response => { console .log(response); }); };
执行结果:
发送PUT请求:例如更新一篇文档
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 btns[2 ].onclick = function ( ) { axios({ method : "PUT" , url : "http://localhost:3000/posts/3" , data : { title : "Today" , author : "Zhangsan" } }).then(response => { console .log(response); }); };
执行结果:
发送DELETE请求
代码:
1 2 3 4 5 6 7 8 9 10 11 btns[3 ].onclick = function ( ) { axios({ method : "DELETE" , url : "http://localhost:3000/posts/3" }).then(response => { console .log(response); }); };
总结
axios传入一个对象,对象的属性必填的有:
2.2.3 其他方式发送请求 对应常用语法的3-7条。
axios.request(config)
,等同于axios(config)
1 2 3 4 5 6 7 8 9 btns[0 ].onclick = function ( ) { axios.request({ method : "GET" , url : "http://localhost:3000/comments" }).then(response => { console .log(response); }); }
1 2 3 4 5 6 7 8 9 10 11 12 btns[1 ].onclick = function ( ) { axios.post( "http://localhost:3000/comments" , { "body" : "Good morning" , "postId" : 2 }).then(response => { console .log(response); }); };
其余请求写法类似。
2.2.4 请求响应结果的结构 即回调函数中response
的结构。以GET请求为例:
2.2.5 请求的配置对象 即发送axios请求时:axios(config)
中的config
对象
These are the available config options for making requests . Only the url
is required. Requests will default to GET
if method
is not specified.
以下字段只摘取重要的字段进行注释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 { url: '/user', method: 'get', baseURL: 'https: transformRequest: [function (data, headers) { return data; }], transformResponse: [function (data) { return data; }], headers: {'X-Requested-With': 'XMLHttpRequest'}, params: { a: 100 , ID: 12345 }, paramsSerializer: function (params) { return Qs.stringify(params, {arrayFormat: 'brackets'}) }, data: { firstName: 'Fred' }, data: 'Country=Brasil&City=Belo Horizonte', timeout: 1000 , withCredentials: false , adapter: function (config) { }, auth: { username: 'janedoe', password: 's00pers3cret' }, responseType: 'json', responseEncoding: 'utf8', xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: 2000 , maxBodyLength: 2000 }
2.2.6 默认配置 对应常用语法的第8条:axios.defaults.xxx: 请求的默认全局配置
例如配置默认请求方式、url携带参数等。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const btns = document .querySelectorAll("button" );axios.defaults.method = "GET" ; axios.defaults.baseURL = "http://localhost:3000" ; axios.defaults.params = { id : 100 }; axios.defaults.timeout = 3000 ; btns[0 ].onclick = function ( ) { axios({ url : "/posts" }).then(response => { console .log(response); }); };
2.2.7 创建实例对象发送请求 对应常用语法第11条:axios.create([config]): 创建一个新的 axios
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const joke = axios.create({ baseURL : "https://api.apiopen.top" , timeout : 2000 }); console .log(joke);joke({ method : "GET" , url : "/getJoke" }).then(response => { console .log(response); }) joke.get("/getJoke" ).then(response => { console .log(response.data); });
2.2.8 拦截器
拦截器(Interceptor
)的分类
拦截器的作用
在请求发送前和接收响应前,对请求数据和响应数据做一些处理
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 axios.interceptors.request.use(function (config ) { console .log("请求拦截器 成功" ); return config; }, function (error ) { console .log("请求拦截器 失败" ) return Promise .reject(error); }); axios.interceptors.response.use(function (response ) { console .log("响应拦截器 成功" ); return response; }, function (error ) { console .log("响应拦截器 失败" ); return Promise .reject(error); }); axios({ method : "GET" , url : "http://localhost:3000/posts" }).then(response => { console .log("自定义回调处理成功的结果" ); }).catch(reason => { console .log("自定义失败回调" ); });
1 2 3 请求拦截器 成功 响应拦截器 成功 自定义回调处理成功的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 axios.interceptors.request.use(function (config ) { console .log("请求拦截器 成功" ); throw "参数异常" ; }, function (error ) { console .log("请求拦截器 失败" ) return Promise .reject(error); }); axios.interceptors.response.use(function (response ) { console .log("响应拦截器 成功" ); return response; }, function (error ) { console .log("响应拦截器 失败" ); return Promise .reject(error); }); axios({ method : "GET" , url : "http://localhost:3000/posts" }).then(response => { console .log("自定义回调处理成功的结果" ); }).catch(reason => { console .log("自定义失败回调" ); });
1 2 3 请求拦截器 成功 响应拦截器 失败 自定义失败回调
情形③:设置分别两个请求和响应拦截器,注意拦截顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 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); }); axios({ method : "GET" , url : "http://localhost:3000/posts" }).then(response => { console .log("自定义回调处理成功的结果" ); }).catch(reason => { console .log("自定义失败回调" ); });
1 2 3 4 5 请求拦截器 成功 - 2号 请求拦截器 成功 - 1号 响应拦截器 成功 - 1号 响应拦截器 成功 - 2号 自定义回调处理成功的结果
即请求拦截器的拦截顺序是倒序的,而响应拦截器的拦截顺序是顺序的。
拦截器中的形参
2.2.9 取消请求 为防止axios发送请求后得到响应过快,可在json服务器端设置延迟响应,这样可观察到取消请求的功能。
1 json-server --watch db.json -d 2000
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 const btns = document .querySelectorAll("button" );let cancel = null ;btns[0 ].onclick = function ( ) { axios({ method : "GET" , url : "http://localhost:3000/posts" , cancelToken : new axios.CancelToken(function (c ) { cancel = c; }) }).then(response => { console .log(response.data); }) }; btns[1 ].onclick = function ( ) { cancel(); };
完善
用户多次点击发送请求,势必会给服务器带来处理压力,因此当用户多次点击发送请求时,检查上次请求是否已经得到响应,如果没有,则取消上次请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 const btns = document .querySelectorAll("button" );let cancel = null ;btns[0 ].onclick = function ( ) { if (cancel !== null ) { cancel(); } axios({ method : "GET" , url : "http://localhost:3000/posts" , cancelToken : new axios.CancelToken(function (c ) { cancel = c; }) }).then(response => { console .log(response.data); cancel = null ; }) }; btns[1 ].onclick = function ( ) { cancel(); };
3 axios源码分析 3.1 axios文件结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ├── /dist/ ├── /lib/ │ ├── /adapters/ │ │ ├── http.js │ │ └── xhr.js │ ├── /cancel/ │ ├── /core/ │ │ ├── Axios.js │ │ ├── dispatchRequest.js │ │ ├── InterceptorManager.js │ │ └── settle.js │ ├── /helpers/ │ ├── axios.js │ ├── defaults.js │ └── utils.js ├── package.json ├── index.d.ts └── index.js
版权声明: 此文章版权归Kisugi Takumi所有,如有转载,请註明来自原作者