axios依靠其优异的性能与特性已经逐渐赶超原生ajax、jquery ajax以及fetch的势头。
虽然它本身已经是一个非常优秀的框架了,但是我们在项目实践中,还需要对axios再进行一次封装,满足项目的个性化请求方式。
以下是可借鉴的封装源码:
// request.js
import axios from 'axios';
import { AJAX_HOST } from './config';
// 请求拦截器
axios.interceptors.request.use(
config => {
return Promise.resolve(config);
},
err => {
let errMsg = '';
if (error && error.response) {
const map = new Map([
[400, '错误请求'],
[401, '未授权,请重新登录'],
[403, '拒绝访问'],
[404, '请求错误,未找到该资源'],
[405, '请求方法未允许'],
[408, '请求超时'],
[500, '服务器端出错'],
[501, '网络未实现'],
[502, '网络错误'],
[503, '服务不可用'],
[504, '网络超时'],
[505, 'http版本不支持该请求']
// ...
]);
const defaultErrorMsg = `连接错误,服务器返回的状态码为 ${err.response.status}`;
errMsg = map.get(err.response.status) || defaultErrorMsg;
} else {
errMsg = "连接到服务器失败";
}
return Promise.reject(errMsg)
// return Promise.reject(err);
},
);
// 响应拦截器
axios.interceptors.response.use(
res => {
if (res.code === 200) {
return Promise.resolve(res);
} else {
// 在实际项目中,需要根据项目情况,编写请求失败提示代码
// console.log(res.msg);
return Promise.reject();
}
},
err => {
console.log(err);
let errMsg =
return Promise.reject(err);
},
);
export default {
async get(url = "", data = {}, options) {
return axios.get(AJAX_HOST + url, data, options);
},
async post(url = "", data = {}, options) {
return axios.post(AJAX_HOST + url, data, options);
},
}
// config.js
export default {
AJAX_HOST: 'https://www.xxx.com/api',
};