import axios from 'axios';
import _ from 'lodash';
// import { QMessage } from 'wd-component'
import config from '@/cfgs/common';
const isdev = environment.includes('start');
// const baseURL = isdev ? '/dev' : `/${environment}`
const baseURL = '';
const timeout = 3000;
// dev / mirror / pre 环境切换域名
const getUrl = (url) =>
isdev ? url : `${config.requestUrl[environment]}${url}`;
const codeMessage = {
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。',
403: '用户得到授权,但是访问是被禁止的。',
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
406: '请求的格式不可得。',
410: '请求的资源被永久删除,且不会再得到的。',
422: '当创建一个对象时,发生一个验证错误。',
500: '服务器发生错误,请检查服务器。',
502: '网关错误。',
503: '服务不可用,服务器暂时过载或维护。',
504: '网关超时。',
};
const errorHandler = (error) => {
const { response } = error;
if (response && response.status) {
// console.log(codeMessage[response.status] || response.statusText)
// QMessage.error(codeMessage[response.status] || response.statusText)
} else if (!response) {
// QMessage.error('网络异常无法连接到服务器')
// console.log('网络异常无法连接到服务器')
}
return response;
};
let cancelToken = axios.CancelToken;
const cancel = [];
const removePending = (config) => {
for (let p in cancel) {
if (cancel[p].u === config.url) {
cancel[p].f();
}
}
};
// 请求拦截器 发送一个请求之前
axios.interceptors.request.use(
(config) => {
//在一个ajax发送前执行一下取消操作
removePending(config);
config.cancelToken = new cancelToken((c) => {
cancel.push({
f: c,
u: config.url,
});
});
// 添加 headers token
// 这块拿不到 dva
const token = localStorage.getItem('token');
if (token) {
config.headers['Authori-zation'] = `Bearer ${token}`;
}
return { timeout, ...config };
},
(error) => {
return Promise.reject(error);
},
);
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
errorHandler(error);
},
);
function processingData(response) {
const data = _.get(response, 'data', null);
if (!_.get(data, 'errno', '')) {
return data;
} else {
QMessage.error(data.msg);
return {};
}
}
// 上传
async function uploadPost(url, payload = {}, other = {}) {
const response = await axios({
method: 'post',
url,
data: payload,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
...other,
}).catch((err) => console.log(err));
return processingData(response);
}
// url 是请求的服务器地址
// payload 参数
// other 其他参数 headers 等
async function post(url, payload = {}, other = {}) {
const response = await axios({
method: 'post',
url,
data: { ...payload },
}).catch((err) => console.log(err));
return processingData(response);
}
async function get(url, payload = {}, other = {}) {
const response = await axios({
method: 'get',
baseURL,
url,
params: { ...payload },
...other,
}).catch((err) => console.log(err));
return processingData(response);
}
async function put(url, payload = {}, other = {}) {
const response = await axios({
method: 'put',
baseURL,
url,
params: { ...payload },
...other,
}).catch((err) => console.log(err));
return processingData(response);
}
async function del(url, payload = {}, other = {}) {
const response = await axios({
method: 'delete',
baseURL,
url,
params: { ...payload },
...other,
}).catch((err) => console.log(err));
return processingData(response);
}
export default {
post,
get,
put,
del,
uploadPost,
};
axios适配版
于 2023-01-16 16:54:28 首次发布
该代码实现了一个基于Axios的HTTP请求管理模块,包括请求和响应拦截器,处理错误,以及定义了GET、POST、PUT、DELETE和上传文件的接口。它还考虑了开发环境和生产环境的URL切换,并对请求结果进行了数据处理。
909

被折叠的 条评论
为什么被折叠?



