提到异步刷新,我们就要想到Ajax:Asynchronous Javascript And XML。它是一种Web数据交互方式,实现方式众多且灵活,例如 封装好的 jQuery、axios 等、或者使用WebSocket、Fetch等APIs实现、甚至可以自己造轮子。
本文介绍基于vue.js 、 node.js 环境下的 axios 的ajax 请求实现方式。
Axios 通过 promise 实现 对ajax 技术的封装,我们可以把它理解成 Axios 是可以发出 http 请求的 JavaScript 库。
Axios 作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
基本特性:从浏览器创建 XMLHttpRequests、从 node.js 创建 http 请求、支持 Promise API、拦截请求和响应、转换请求和响应数据、取消请求、自动转换JSON数据、客户端支持防御XSRF。
以上概念大部分来自于官方文档,通过官方文档对Axios 的介绍,我们进一步了解了Axios 作用于什么环境,它大概是怎么实现ajax请求的。
“实践是检验真理的唯一标准”,既然axios已经被大佬们封装起来了,那么我们就用起来!
本文的 axios 使用示例基于 vue-cli + vue 2.x 环境,读者可根据自身开发环境灵活参考。
我们可以通过标签进行 axios 引入,也可以通过 npm 下载,例如:
$ npm install axios
在本文示例的环境中,我们在vue cli 下下载并配置axios:
首先在vuecli项目的terminal中键入
npm i axios -S
main.js配置
import axios from 'axios'
Vue.prototype.axios = axios
完成上述配置,我们就可以在前端项目中编写 axios 相关请求了。
基本格式:
const axios = require('axios');
// 向给定ID的用户发起请求
axios.get('/user?ID=12345')
.then(function (response) {
// 处理成功情况
console.log(response);
})
.catch(function (error) {
// 处理错误情况
console.log(error);
})
.then(function () {
// 总是会执行
});
// 上述请求也可以按以下方式完成(可选)
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.then(function () {
// 总是会执行
});
// 支持async/await用法
async function getUser() {
try {
const response = await axios.get('/user?ID=12345');
console.log(response);
} catch (error) {
console.error(error);
}
}
具体例子,例如我们在某个项目中,获取管理员列表:
console.log('准备从服务器获取管理员列表……');
let url = 'http://xxxxxx/xxxxxx/admins';
this.axios.get(url).then((response) => {
console.log('服务器端响应的结果:')
console.log(response);
let responseBody = response.data;
if (responseBody.state == 20000) {
this.tableData = responseBody.data;
} else {
this.$message.error(responseBody.message);
}
});
基本格式:
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
并发的情况:
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
Promise.all([getUserAccount(), getUserPermissions()])
.then(function (results) {
const acct = results[0];
const perm = results[1];
});
具体例子,例如我们要在某个项目中实现"新增类别"的请求:
this.$refs[formName].validate((valid) => {
if (valid) {
let url = 'http://xxxxxxxx/xxxxxx/categories/add-new';
console.log('尝试添加类别……');
console.log('请求路径:' + url);
console.log('请求参数:' + this.ruleForm);
console.log(this.ruleForm);
let formData = this.qs.stringify(this.ruleForm);
console.log('将ruleForm对象转换为FormData:');
console.log(formData);
//发起axios请求
this.axios.post(url, formData).then((response) => {
console.log('服务器端响应的结果:' + response);
console.log(response);
let responseBody = response.data;
if (responseBody.state == 20000) {
console.log('添加类别成功');
this.$message({
message: '添加类别成功!',
type: 'success'
});
this.resetForm(formName);
} else {
console.log(responseBody.message);
this.$message.error(responseBody.message);
}
});
} else {
console.log('error submit!!');
return false;
}
});
至于对 Axios 更深入的学习,例如通过axios实现,可以参考官方文档:
Axios 官方文档
本文介绍了ajax的基本概念以及axios这种ajax实现方式。异步请求的交互方式在前后端交互使用较多,读者入门后请多加应用、练习。