Files
mayfly-go/mayfly_go_web/src/common/request.ts

164 lines
4.3 KiB
TypeScript
Raw Normal View History

import router from "../router";
import Axios from 'axios';
import { ResultEnum } from './enums'
import Api from './Api';
import config from './config';
2021-09-08 17:55:57 +08:00
import { getSession } from './utils/storage';
import { templateResolve } from './utils/string';
import { ElMessage } from 'element-plus';
export interface Result {
/**
*
*/
code: number;
/**
*
*/
msg: string;
/**
*
*/
data?: any;
}
const baseUrl: string = config.baseApiUrl as string
/**
*
* @param msg
*/
function notifyErrorMsg(msg: string) {
// 危险通知
ElMessage.error(msg);
}
// create an axios instance
const service = Axios.create({
baseURL: baseUrl, // url = base url + request url
timeout: 20000 // request timeout
})
// request interceptor
service.interceptors.request.use(
(config: any) => {
// do something before request is sent
const token = getSession("token")
if (token) {
// 设置token
config.headers['Authorization'] = token
}
return config
},
error => {
return Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
// 获取请求返回结果
const data: Result = response.data;
// 如果提示没有权限则移除token使其重新登录
if (data.code === ResultEnum.NO_PERMISSION) {
2021-06-09 16:58:57 +08:00
router.push({
path: '/401',
});
}
if (data.code === ResultEnum.SUCCESS) {
return data.data;
} else {
return Promise.reject(data);
}
},
(e: any) => {
if (e.message) {
// 对响应错误做点什么
if (e.message.indexOf('timeout') != -1) {
notifyErrorMsg('网络超时');
} else if (e.message == 'Network Error') {
notifyErrorMsg('网络连接错误');
} else if (e.message.indexOf('404')) {
notifyErrorMsg('请求接口找不到');
} else {
if (e.response.data) ElMessage.error(e.response.statusText);
else notifyErrorMsg('接口路径找不到');
}
}
return Promise.reject(e)
}
)
/**
* uri
* code != 200message提示,(,),catch继续处理
*
* @param {Object} method (GET,POST,PUT,DELTE等)
* @param {Object} uri uri
* @param {Object} params
*/
function request(method: string, url: string, params: any = null, headers: any = null, options: any = null): Promise<any> {
if (!url)
throw new Error('请求url不能为空');
// 简单判断该url是否是restful风格
if (url.indexOf("{") != -1) {
url = templateResolve(url, params);
}
const query: any = {
method,
url: url,
2022-02-08 17:52:35 +08:00
...options
};
if (headers) {
query.headers = headers
}
const lowMethod = method.toLowerCase();
// post和put使用json格式传参
if (lowMethod === 'post' || lowMethod === 'put') {
query.data = params;
} else {
query.params = params;
}
return service.request(query).then(res => res)
.catch(e => {
// 如果返回的code不为成功则会返回对应的错误msg则直接统一通知即可
if (e.msg) {
notifyErrorMsg(e.msg)
}
return Promise.reject(e);
});
}
/**
* api执行对应接口
* @param api Api实例
* @param params
*/
2022-02-08 17:52:35 +08:00
function send(api: Api, params: any, options: any): Promise<any> {
return request(api.method, api.url, params, null, options);
}
/**
* api执行对应接口
* @param api Api实例
* @param params
*/
function sendWithHeaders(api: Api, params: any, headers: any): Promise<any> {
2022-02-08 17:52:35 +08:00
return request(api.method, api.url, params, headers, null);
}
function getApiUrl(url: string) {
// 只是返回api地址而不做请求用在上传组件之类的
return baseUrl + url + '?token=' + getSession('token');
}
export default {
request,
send,
sendWithHeaders,
getApiUrl
}