随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解。本来想在网上找找详细攻略,突然发现,axios 的官方文档本身就非常详细!!有这个还要什么自行车!!所以推荐大家学习这种库,最好详细阅读其官方文档。大概翻译了一下 axios 的官方文档,相信大家只要吃透本文再加以实践,axios 就是小意思啦!!
如果您觉得本文对您有帮助,不妨点个赞或关注收藏一下,您的鼓励对我非常重要。
axios 简介
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:
从浏览器中创建 XMLHttpRequest
从 node.js 发出 http 请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
取消请求
自动转换JSON数据
客户端支持防止 CSRF/XSRF
浏览器兼容性
引入方式:
1 2 3 4 5
| $ npm install axios $ cnpm install axios $ bower install axios 或者使用cdn: <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
|
举个栗子:
执行 GET 请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
|
执行 POST 请求
1 2 3 4 5 6 7 8 9 10
| axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
|
执行多个并发请求
1 2 3 4 5 6 7 8 9 10 11 12
| function getUserAccount() { return axios.get('/user/12345'); } function getUserPermissions() { return axios.get('/user/12345/permissions'); } axios.all([getUserAccount(), getUserPermissions()]) .then(axios.spread(function (acct, perms) { }));
|
axios API
可以通过将相关配置传递给 axios 来进行请求。
axios(config)
1 2 3 4 5 6 7 8 9
| axios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' } });
|
axios(url[, 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]])
注意
当使用别名方法时,不需要在config中指定url,method和data属性。
并发
帮助函数处理并发请求。
axios.all(iterable)
axios.spread(callback)
创建实例
您可以使用自定义配置创建axios的新实例。
axios.create([config])
1 2 3 4 5
| var instance = axios.create({ baseURL: 'https://some-domain.com/api/', timeout: 1000, headers: {'X-Custom-Header': 'foobar'} });
|
实例方法
可用的实例方法如下所示。 指定的配置将与实例配置合并。
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]])
请求配置
这些是用于发出请求的可用配置选项。 只有url是必需的。 如果未指定方法,请求将默认为GET。
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
| { url: '/user', method: 'get', baseURL: 'https://some-domain.com/api/', transformRequest: [function (data) { 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', 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, 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) { }) }
|
使用 then 时,您将收到如下响应:
1 2 3 4 5 6 7 8
| axios.get('/user/12345') .then(function(response) { console.log(response.data); console.log(response.status); console.log(response.statusText); console.log(response.headers); console.log(response.config); });
|
配置默认值
您可以指定将应用于每个请求的配置默认值。
全局axios默认值
1 2 3
| axios.defaults.baseURL = 'https://api.example.com'; axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
|
自定义实例默认值
1 2 3 4 5 6 7
| var instance = axios.create({ baseURL:'https://api.example.com' }); instance.defaults.headers.common ['Authorization'] = AUTH_TOKEN;
|
配置优先级顺序
配置将与优先顺序合并。 顺序是lib / defaults.js中的库默认值,然后是实例的defaults属性,最后是请求的config参数。 后者将优先于前者。 这里有一个例子。
1 2 3 4 5 6 7 8 9 10 11 12
| var instance = axios.create(); instance.defaults.timeout = 2500; instance.get('/ longRequest',{ timeout:5000 });
|
拦截器
你可以截取请求或响应在被 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); });
|
如果你以后可能需要删除拦截器。
1 2
| var myInterceptor = axios.interceptors.request.use(function () {}); axios.interceptors.request.eject(myInterceptor);
|
你可以将拦截器添加到axios的自定义实例。
1 2
| var instance = axios.create(); instance.interceptors.request.use(function () {});
|
处理错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| axios.get('/ user / 12345') .catch(function(error){ if(error.response){ console.log(error.response.data); console.log(error.response.status); console.log(error.response.headers); } else { console.log('Error',error.message); }} console.log(error.config); });
|
您可以使用validateStatus配置选项定义自定义HTTP状态码错误范围。
1 2 3 4 5
| axios.get('/ user / 12345',{ validateStatus:function(status){ return status < 500; }} })
|
消除
您可以使用取消令牌取消请求。
axios cancel token API基于可取消的promise提议,目前处于阶段1。
您可以使用CancelToken.source工厂创建一个取消令牌,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var CancelToken = axios.CancelToken; var source = CancelToken.source(); axios.get('/user/12345', { cancelToken: source.token }).catch(function(thrown) { if (axios.isCancel(thrown)) { console.log('Request canceled', thrown.message); } else { } }); source.cancel('操作被用户取消。');
|
您还可以通过将执行器函数传递给CancelToken构造函数来创建取消令牌:
1 2 3 4 5 6 7 8 9 10 11 12
| var CancelToken = axios.CancelToken; var cancel; axios.get('/ user / 12345',{ cancelToken:new CancelToken(function executor(c){ cancel = c; }) }); clear();
|
注意:您可以使用相同的取消令牌取消几个请求。
默认情况下,axios将JavaScript对象序列化为JSON。 要以应用程序/ x-www-form-urlencoded格式发送数据,您可以使用以下选项之一。
浏览器
在浏览器中,您可以使用URLSearchParams API,如下所示:
1 2 3 4
| var params = new URLSearchParams(); params.append('param1', 'value1'); params.append('param2', 'value2'); axios.post('/foo', params);
|
请注意,所有浏览器都不支持URLSearchParams,但是有一个polyfill可用(确保polyfill全局环境)。
或者,您可以使用qs库对数据进行编码:
1 2
| var qs = require('qs'); axios.post('/foo', qs.stringify({ 'bar': 123 });
|
Node.js
在node.js中,可以使用querystring模块,如下所示:
1 2
| var querystring = require('querystring'); axios.post('http://something.com/', querystring.stringify({ foo: 'bar' });
|
你也可以使用qs库。
Promise
axios 依赖本机要支持ES6 Promise实现。 如果您的环境不支持ES6 Promises,您可以使用polyfill。
TypeScript
axios包括TypeScript定义。
1 2
| import axios from 'axios'; axios.get('/user?ID=12345');
|
axios在很大程度上受到Angular提供的$http服务的启发。 最终,axios努力提供一个在Angular外使用的独立的$http-like服务。