Axios由浅入深
1. 什么是axiosaxios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装,可以用于浏览器和node.js。axios是ajax, ajax不止axios2. 为什么使用axiosAxios非常适合前后端数据交互,另一种请求后端数据的方式是vue-resource...
·
1. 什么是axios
axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。
简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装,可以用于浏览器和node.js。axios是ajax, ajax不止axios
2. 为什么使用axios
Axios非常适合前后端数据交互,另一种请求后端数据的方式是vue-resource,vue-resource已经不再更新了,且只支持浏览器端使用,而且Vue的开发者尤雨溪推荐使用更好的第三方工具,这就是Axios
3. 安装axios的方式
1. 通过cnpm安装 (淘宝镜像)
cnpm install axios
2. 通过bower安装
bower install axios
3. 通过yarn安装
yarn add axios
4. cdn使用
<script src="https://cdn.bootcss.com/axios/0.19.2/axios.js"></script>
axios 请求
1. 执行get请求
axios
.get(
"https://api.douban.com/v2/movie/top250?apikey=0b2bdeda43b5688921839c8ecb20399b&count=1&total=10"
)
.then(resolve => {
console.log(resolve);
})
.catch(error => {
console.log(error);
});
2. 执行post请求
axios
.post("/user", {
first: "Fred",
second: "Flintstone",
})
.then(function(response) {
console.log(response);
})
.catch(function(error) {
console.log(error);
});
3. 发起多个请求
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) {
// Both requests are now complete
}));
4.注意事项
在使用 GET 方法传递参数时使用的是 params,并且官方文档中介绍:
参数是与请求一起发送的URL参数。必须是一个普通对象或URLSearchParams对象。
params 作为 URL 链接中的参数发送请求,且其必须是一个 plain object 或者是 URLSearchParams object 。
plain object(纯对象):是指 JSON 形式定义的普通对象或者 new Object() 创建的简单对象;
URLSearchParams object:指的是一个可以由 URLSearchParams
接口定义的一些实用方法来处理 URL 的查询字符串的对象,
也就是说 params 传参是以 /user?ID=1&name=mike&sex=male 形式传递的。
而在使用 POST 时对应的传参使用的是 data,data 是作为 请求体 发送的,同样使用这种形式的还有 PUT、PATCH 等请求方法。
有一点需要注意的是,axios 中 POST 的默认请求体类型为 Content-Type:application/json(JSON 规范流行),
这也是最常见的请求体类型,也就是说使用的是序列化后的 json 格式字符串来传递参数,
如: { "name" : "mike", "sex" : "male" };同时,
后台必须要以支持 @RequestBody 的形式来接收参数,
否则会出现前台传参正确,后台不接收的情况。
如果想要设置类型为 Content-Type:application/x-www-form-urlencoded(浏览器原生支持),axios 提供了两种方式,如下:
浏览器端
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/user', params);
不过,并不是所有浏览器都支持 URLSearchParams, 兼容性查询caniuse.com,
但是这里有一个Polyfill(polyfill:用于实现浏览器并不支持的原生 API 的代码,
可以模糊理解为补丁,同时要确保 polyfill 在全局环境中)。
或者,你也可以用 qs 这个库来格式化数据,
默认情况下在安装完 axios 后就可以使用 qs 库。
const qs = require('qs');
axios.post('/user', qs.stringify({'name': 'mike'}));
node 层
在 node 环境中可以使用 querystring 。同样,也可以使用 qs 来格式化数据。
const querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({'name':'mike'}));
补充
常见的请求体类型还有一种方式,即multipart/form-data(浏览器原生支持),也就是提交表单数据常用的一种格式。
和x-www-form-urlencoded对比起来,后者则是数据被编码成以 '&' 分隔的键-值对, 同时以 '=' 分隔键和值。
非字母或数字的字符会被Percent-encoding(URL encoding),
这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替)。
5. Axios API
axios 请求方法别名:
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、methods、data 这些属性都不必在配置中指定。
6. Axios 同时发生多个请求
axios.all(iterable)
axios.spread(callback)
7. Axios 拦截器
**可以在then和catch之前设置拦截请求活响应**
axios.interceptors.request.use(function (config) {
//判断是否为post请求
if(config.method == 'post'){
//处理数据 qs已引入
config.data = qs.stringify(config.data);
}
return config;
}, function (error) {
// 处理请求错误
return Promise.reject(error);
});
**添加一个响应拦截器**
axios.interceptors.response.use(function (response) {
// 位于2xx范围内的任何状态代码都会触发此函数
// 对响应数据做些什么
return response;
}, function (error) {
// 任何超出2xx范围的状态码都会触发此函数
// 处理响应错误
return Promise.reject(error);
});
**移除拦截器**
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
**为axios实例添加拦截器**
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});
8. 创建实例
**创建实例**
可以使用自定义配置新建一个 axios 实例
axios.create([config])实例方法以下是可用的实例方法。
**以下是可用的实例方法。指定的配置将与实例的配置合并。**
axios#request(config)
axios#get(url[, config])
axios#delete(url[, config])
axios#head(url[, config])
axios#options(url[, config])
axios#post(url[, data[, config]])
axios#put(url[, data[, config]])
axios#patch(url[, data[, config]])
9. 使用 cancel token 取消请求
可以使用 CancelToken.source 工厂方法创建 cancel token,像这样:
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 {
// 处理错误
}
});
// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');
还可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建cancel token:
更多推荐
已为社区贡献15条内容
所有评论(0)