目录
一、安装axios
二、二次封装axios
三、对异常进行处理
四、编写接口
五、调用
一、安装axios
npm install --save axios
二、二次封装axios
在src目录下新建utils文件夹(常用的一些工具都可以放在里面),在utils目录下新建api.js文件来对axios进行二次封装。
import axios from "axios";
import router from "../router";
import store from "../store";
import { Message } from "element-ui";
// 设置请求的基础信息
// 开发环境可以在vue.config.js中配置代理
const Axios = axios.create({
baseURL:
process.env.NODE_ENV === "production" ? process.env.VUE_APP_URL : "/api/",
timeout: 10000 // 请求超时时间
});
// 封装post方法
const POST = (url, data) => {
return Axios({
method: "post",
url: url,
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
};
三、对异常进行处理
有些请求是需要用户登录之后才可以访问的,我们可以在发送请求前进行一个请求的拦截。也可以在请求之前处理一下我们的数据,例如对要提交的数据序列化。在每次请求接口的时候,可以在请求的header中携带token,后台根据携带的token来判断登录是否过期,如果没有携带,则说明没有登录过。(注意:前端的请求中可以携带token,但后台可以选择不接收)
// 请求拦截器,可以设置请求头
Axios.interceptors.request.use(
config => {
if (localStorage.getItem("token")) {
config.headers["Authorization"] = localStorage.getItem("token");
}
// config.headers["Content-Type"] = "application/json";
config.headers["Content-Type"] = "application/x-www-form-urlencoded";
return config;
},
error => {
console.log(error);
Promise.reject(error);
}
);
// 响应拦截器
Axios.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
error => {
// 请求超时,可以提示稍后重试,也可以新建promise再次请求(注意控制请求次数避免一直请求)
const { code, message } = error;
if (code === "ECONNABORTED" && message.indexOf("timeout") !== -1) {
Message.error("请求超时,请稍后重试");
}
if (error.response.status ) {
switch (error.response.status ) {
// 401 跳转登录页并携带当前页面路径参数,登陆后返回该页面
case 401:
router.replace({
path: "/login",
query: {
redirect: router.currentRoute.fullPath
}
});
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页并携带当前页面路径参数,登陆后返回该页面
case 403:
Message.error("登录过期,请重新登录");
localStorage.removeItem("token");
store.commit("loginSuccess", null);
setTimeout(() => {
router.replace({
path: "/login",
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Message.error("网络请求不存在");
break;
// 其他错误,直接抛出错误提示
default:
Message.error(error.response.data.message);
}
return Promise.reject(error.response);
}
}
);
四、编写接口
接下来就要根据你的业务去写你的接口了(这里我们把接口都暴露出去,方便后续的调用)
export default {
login: data => {
return POST("auth/login", data);
}
};
五、调用
在main.js中引入你写好的api.js文件,然后通过prototype挂载到Vue实例上,后续调用时可以直接在Vue实例上找到api下的对应的接口方法啦。
import api from "./utils/api";
Vue.prototype.api = api;
mounted() {
this.api.login({}).then(res => {
console.log(res);
// 你的业务逻辑
});
}
补充:跨域代理设置
devServer: {
// 端口设置
port: port,
open: true,
// VUE_APP_URL就是你要调用的接口地址
proxy: {
"/api": {
target: VUE_APP_URL,
changOrigin: true, // 允许跨域
ws: true,
pathRewrite: {
"^/api": "api"
}
}
}
}
结语:本人知识有限,文章内容如有错误,劳烦留言指出。