Axios学习 本教程里的资料来源于网友的资料,自己整理以供学习。视频学习:黑马程序员
选择什么网络模块? Ajax 选择一: 传统的Ajax是基于XMLHttpRequest(XHR)
为什么不用它呢?
非常好解释, 配置和调用方式等非常混乱. 编码起来看起来就非常蛋疼. 所以真实开发中很少直接使用, 而是使用jQuery-Ajax jQuery-Ajax 选择二: 在前面的学习中, 我们经常会使用jQuery-Ajax
为什么不选择它呢?
首先, 我们先明确一点: 在Vue的整个开发中都是不需要使用jQuery了. 那么, 就意味着为了方便我们进行一个网络请求, 特意引用一个jQuery, 你觉得合理吗? jQuery的代码1w+行. Vue的代码才1w+行. 完全没有必要为了用网络请求就引用这个重量级的框架. Vue-resource 选择三: 官方在Vue1.x的时候, 推出了Vue-resource.
Vue-resource的体积相对于jQuery小很多. 另外Vue-resource是官方推出的. 为什么不选择它呢?
在Vue2.0退出后, Vue作者就在GitHub的Issues中说明了去掉vue-resource, 并且以后也不会再更新. 那么意味着以后vue-reource不再支持新的版本时, 也不会再继续更新和维护. 对以后的项目开发和维护都存在很大的隐患. Axios Vue作者推荐,axios有非常多的优点, 并且用起来也非常方便.
特性
axiox请求方式 axios(config)
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
axios的基本使用 常见请求的参数 Get请求
axios.get(url, params).then(res => { do something })
例子:
1 2 3 4 5 axios.get ("xxx" , { params :{ id : 1 } }).then (res => { consloe.log (res.data ) })
Post请求
axios.post(url, data).then(res => { do something })
1 axios.get ("xxx" , this .form ).then (res => { consloe.log (res.data ) })
axios的并发请求 当想同时请求多个地址时、就需要使用axios.all(iterable)
类似: axios.all([axios({}),axios({}),...]).then()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import axios from "axios" axios.all ([axios ({ url : "http://123.207.32.32:8000/home/multidata" , type : "get" }), axios ({ url : "http://123.207.32.32:8000/home/data" , type : "get" , params : { type : 'pop' , page : 1 } })]).then ((results ) => { console .log (results) })
使用 axios.spread
可将数组 [res1,res2] 展开为 res1, res2
1 2 3 4 5 6 7 8 9 10 11 12 13 axios.all ([axios ({ url : "http://123.207.32.32:8000/home/multidata" , type : "get" }), axios ({ url : "http://123.207.32.32:8000/home/data" , type : "get" , params : { type : 'pop' , page : 1 } })]).then (axios.spread ((data1, data2 ) => { console .log (data1, data2) }))
axios的全局配置 事实上, 在开发中可能很多参数都是固定的、这个时候我们可以进行一些抽取, 也可以利用axios的全局配置
axios.defaults.baseURL = '123.207.32.32:8000'
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import axios from "axios" axios.defaults .baseURL = "http://123.207.32.32:8000" axios.defaults .timeout = 5000 axios.all ([axios ({ url : "/home/multidata" , type : "get" }), axios ({ url : "/home/data" , type : "get" , params : { type : 'pop' , page : 1 } })]).then (axios.spread ((data1, data2 ) => { console .log (data1, data2) }))
通过配置全局的baseURL可以省略掉这前面固定的部分,发送请求只需要填写后面的部分即可组合起来请求地址,发送请求。
请求配置 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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 { url : '/user' , method : 'get' , 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 : function (params ) { return Qs .stringify (params, {arrayFormat : 'brackets' }) }, data : { firstName : 'Fred' }, timeout : 1000 , withCredentials : false , adapter : function (config ) { }, auth : { username : 'janedoe' , password : 's00pers3cret' }, responseType : 'json' , responseEncoding : 'utf8' , xsrfCookieName : 'XSRF-TOKEN' , xsrfHeaderName : 'X-XSRF-TOKEN' , onUploadProgress : function (progressEvent ) { }, onDownloadProgress : function (progressEvent ) { }, maxContentLength : 2000 , validateStatus : function (status ) { return status >= 200 && status < 300 ; }, maxRedirects : 5 , socketPath : null , httpAgent : new http.Agent ({ keepAlive : true }), httpsAgent : new https.Agent ({ keepAlive : true }), proxy : { host : '127.0.0.1' , port : 9000 , auth : { username : 'mikeymike' , password : 'rapunz3l' } }, cancelToken : new CancelToken (function (cancel ) { }) }
axios的实例 为什么要创建axios的实例呢? 可以设置默认配置、规定配置
可以使用自定义配置新建一个 axios 实例 axios.create([config])
1 2 3 4 5 6 7 8 9 10 11 const instance = axios.create ({ baseURL : "http://123.207.32.32:8000" , timeout : 5000 }) instance ({ url : "/home/multidata" , type : "get" }).then ((res )=> { console .log (res) })
axios的封装 为了保证代码的后期维护、我们需要对axios进行封装
在src下创建network/request.js
操作 Promise形式
1 2 3 4 5 6 7 8 9 import axios from 'axios' export function request (config ) { const instance = axios.create ({ baseURL : "http://123.207.32.32:8000" , timeout : 5000 }) return instance (config) }
使用:
1 2 3 4 5 6 7 8 import {request} from "./network/request" ;request ({ url : "/home/multidata" , type : "get" }).then ((res ) => { console .log (res) })
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import axios from "axios" ;export function request (config ) { return new Promise ((resolve, reject ) => { const instance = axios.create ({ baseURL : 'http://123.207.32.32:8000/' , timeout : 50000 }) instance (config) .then (res => { resolve (res) }) .catch (err => { reject (err) }) }) }
使用:
1 2 3 4 5 6 7 8 9 import {request} from "./network/request" ;request ({ url : 'home/multidata' }).then (res => { console .log (res) }).catch (err => { console .log (err); })
axios的拦截器 在请求或响应被 then
或 catch
处理前拦截它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 axios.interceptors .request .use (function (config ) { return config; }, function (error ) { return Promise .reject (error); }); axios.interceptors .response .use (function (response ) { return response; }, function (error ) { return Promise .reject (error); });
查看代码 request.js
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 import axios from 'axios' export function request (config ) { const instance = axios.create ({ baseURL : "http://123.207.32.32:8000" , timeout : 5000 }) instance.interceptors .request .use (config => { console .log ("拦截的请求" ); console .log (config) return config; },err => { console .log (err) }) instance.interceptors .response .use (response => { console .log ("拦截的响应" ); console .log (response); return response.data },err => { console .log (err) }) return instance (config) }
main.js
1 2 3 4 5 6 7 8 9 import {request} from "./network/request" ;request ({ url : "/home/multidata" , type : "get" }).then ((res ) => { console .log ('请求成功返回的结果' ); console .log (res) })