前言
在Vue1.0中我们知道和服务端通信发送请求获取数据依赖的是vue-resource,但自Vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是改成了推荐的Axios这一HTTP库。作用上类似我们熟知的一些Ajax库,但是Axios是基于Promise的HTTP请求客户端,可同时在浏览器和Node.js中使用,这好像更符合目前前端的技术新趋势。现将Axios的官方文档及示例做一介绍。
实现的功能特点
- 可以从浏览器端发起XMLHttpRequests请求
- node端发起http请求
- 支持Promise API
- 监听请求和响应
- 转化请求和返回响应数据
- 取消请求
- JSON数据自动转化
- 客户端支持防御CSRF攻击
浏览器支持
Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |
安装
使用npm
1 | $ npm install axios |
使用bower
1 | $ bower install axios |
使用CDN
1 | <script src="https://unpkg.com/axios/dist/axios.min.js"></script> |
示例
发起一个GET请求
1 | // 发起一个user请求 |
发起一个POST请求
1 | axios.post('/user', { |
发起一个多重并发请求
1 | function getUserAccount() { |
Axios API
axios能够在进行请求时进行一些设置。
axios(config)
1 | // 发起POST请求 |
1 | // 请求远程服务的一张图片 |
axios(url[, config])
1 | // 发起一个GET请求 |
请求方法别名
为了方便axios提供了所有请求方法的别名
1 | axios.request(config) |
1 | axios.get(url[, config]) |
1 | axios.delete(url[, config]) |
1 | axios.head(url[, config]) |
1 | axios.options(url[, config]) |
1 | axios.post(url[, data[, config]]) |
1 | axios.put(url[, data[, config]]) |
1 | axios.patch(url[, data[, config]]) |
并发
处理并发请求有用的方法
1 | axios.all(iterable) |
1 | axios.spread(callback) |
创建一个实例
你可以使用自定义设置创建一个新的实例
1 | axios.create([config]) |
1 | var instance = axios.create({ |
请求配置
以下列出了一些请求时的设置。只有url是必须的,如果没有指明的话,默认的请求方法是GET。
1 | { |
响应概要
一个请求的响应包含以下信息
1 | { |
如果你使用then,你将获取到以下响应返回结果
1 | axios.get('/user/12345') |
使用catch时,或者传入一个reject callback作为then的第二个参数,那么返回的错误信息将能够被使用。
默认设置
你可以设置一个默认的设置将在所有的请求中有效。
全局默认设置:
1 | axios.defaults.baseURL = 'https://api.example.com'; |
实例中自定义默认值
1 | // 当创建一个实例时进行默认设置 |
设置优先级
设置(config)将按照优先顺序整合起来。首先的是在 lib/defaults.js 中定义的默认设置,其次是 defaults 实例属性的设置,最后是请求中 config 参数的设置。越往后面的等级越高,会覆盖前面的设置
1 | // 使用默认库的设置创建一个实例, |
拦截器
你可以在requests或者responses被then或者catch处理之前对他们进行拦截
1 | // 添加一个请求拦截器 |
如果你需要在稍后移除拦截器
1 | var myInterceptor = axios.interceptors.request.use(function(){/*...*/}); |
你可以在一个axios实例中使用拦截器
1 | var instance = axios.create(); |
错误处理
1 | axios.get('user/12345') |
axios.get(‘user/12345’,{
validateStatus:function(status){
return status < 500; // Reject only if the status code is greater than or equal to 500
}
});1
2
3
4
5
6
### 取消请求
可以使用cancel token取消一个请求。
可以使用CancelToke.source工厂函数创建一个cancel token:
var source = CancelToken.source();
axios.get(‘/user/12345’, {
cancelToken:source.toke
}).catch(function(thrown) {
if (axiso.isCancel(thrown)) {
console.log(‘Rquest canceled’, thrown.message);
} else {
// handle error
// TODO
}
});
// 取消请求(信息参数是可设置的)
source.cancel(‘Operation canceled by the user.’);1
2
可以给CancelToken构造函数传递一个executor function来创建一个cancel token:
var CancelToken = axios.CancelToken;
var cancel;
axios.get(‘/user/12345’, {
cancelToken: new CancelToken(function executor(c) {
// 这个executor函数接受一个cancel function作为参数
cancel = c;
})
});
// 取消请求
cancel();1
2
3
4
### Node.js
在nodejs中可以如下使用querystring:
var querystring = require(‘querystring’);
axios.post(‘http://something.com/', querystring.stringify({foo:’bar’}));`
Promises
axios基于原生的ES6 Promise实现。如果环境不支持请使用polyfill。