Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 说明: 本文介绍Vue 开发中对axios 的封装处理,不对axios 概念详细介绍 项目api基本结构 当然了使用yarn 或者 bower都可以了,看自己用的什么包管理器就用什么安装,也可以直接用cdn 一般我们封装可以划分为以下三步 创建 service.js 文件 创建服务 异常提示及错误处理 请求拦截(如在请求前给headers中添加token) 响应处理 (首先判断http 请求是否成功,然后判断业务接口处理数据返回是否正常) 加载api 使用require.context 工程自动化导入所有的接口模块 挂载api 到原型链上 具体参数传递处理是指定字段还是统一json ,看项目架构了 页面中就可以直接这样调用了,不用导入指定模块 一般建议接口文件名称和页面模块相对应,这样找的时候可以很快找到,基础代码都在上面了,实际业务开发中还会进行扩展及处理,如批量请求等本文没有做封装处理,当然有些业务也不一定需要封装请求,具体根据架构处理。安装
npm install axios --save
封装请求
import axios from "axios";
const service = axios.create();
// 记录和显示错误
const TipLog = msg => {
Message({
message: msg,
type: "warning",
showClose: true
});
};
const errorHandle = (status, msg) => {
switch (status) {
case "exceeded":
TipLog(msg);
break;
case 400:
TipLog(`请求出错: ${msg}`);
break;
case 401:
TipLog(msg);
store.dispatch('ZAdmin/user/logout')
break;
case 403:
TipLog(`拒绝访问: ${msg}`);
break;
case 404:
TipLog("请求不存在");
break;
case 408:
TipLog("请求超时");
break;
case 426:
TipLog(`${msg}`);
break;
case 500:
TipLog(`服务器内部错误:${msg}`);
break;
case 501:
TipLog("服务未实现");
break;
case 502:
TipLog("网关错误");
break;
case 503:
TipLog("服务不可用");
break;
default:
TipLog(msg);
break;
}
};
service.interceptors.request.use(
request => {
const token = utils.cookies.get("token");
const isToken = (request.headers || {}).isToken === false
if (token && !isToken) {
request.headers['token'] = 'Bearer ' + token// token
}
return request
}
)
service.interceptors.response.use(
async response => {
const { status, data } = response
if (status === 200) {
// 这儿业务接口处理成功数据状态码和后端讨论统一
if (data.code === 0) {
return data.data;
} else {
errorTipLog(data.msg)
return Promise.reject(data.msg);
}
} else {
errorTipLog(data.msg)
return Promise.reject(data.msg);
}
},
error => {
const { response } = error;
if (
error.code === "ECONNABORTED" &&
error.message.indexOf("timeout") !== -1
) {
// 接口请求超时处理,一般建议重新请求一次,根据系统架构确定
var originalRequest = error.config;
return axios.request(originalRequest);
// errorHandle("exceeded", "请求超时");
} else {
console.log(response, 'response')
errorHandle(response.status, response.data.msg);
}
return Promise.reject(error);
}
);
import { request } from './service'
const files = require.context('./modules', false, /\.js$/)
const apiGenerators = files.keys().map(key => files(key).default)
let api = {}
apiGenerators.forEach(generator => {
const apiInstance = generator({
request
})
for (const apiName in apiInstance) {
if (Object.prototype.hasOwnProperty.call(apiInstance, apiName)) {
api[apiName] = apiInstance[apiName]
}
}
})
export default api
main.js 中
import api from "@/api";
Vue.prototype.$api = api;
api 模块写法
// 接口api
export default ({ request }) => ({
// get 方法
app_list(query = {}) {
return request({
url: "/url",
method: "get",
params: query,
});
},
// 删除delete
app_del(query = {}) {
return request({
url: "/url",
method: "delete",
data: query,
});
},
// 新增post
app_add(query = {}) {
return request({
url: "/url",
method: "post",
data: query,
});
},
// 编辑 put
app_edit(query = {}) {
return request({
url: "/url",
method: "put",
data: query,
});
}
});
调用请求
this.$api.app_list().then(res=> {
console.log(res)
})