press-next
Version:
Vue3 组件库,支持 Composition API
56 lines (48 loc) • 1.47 kB
text/typescript
import { BaseRequest } from '../base/base-request';
import { axios } from './axios';
import type { IBaseRequestOptions, IBaseRequestParam } from '../types';
/**
* web端Post请求发送类,基于axios
*/
export class WebRequest extends BaseRequest {
private readonly axios: any;
constructor(options: IBaseRequestOptions) {
super(options);
const config = {
withCredentials: options?.extra?.withCredentials !== false, // 跨域送cookie
transformResponse: [this.transformJson],
};
this.axios = axios.create(config);
}
doSend(param: IBaseRequestParam): Promise<any> {
return this.axios({
method: param.method ? param.method : 'post',
headers: param.headers ? param.headers : {},
url: param.url,
data: param.reqData,
params: param.method === 'get' && param.reqData ? param.reqData : {},
// 支持透传axios参数
...param.extra?.axiosParam,
});
}
/**
* 字符串转化为json对象
* @param data
*/
transformJson(data: any) {
if (typeof data === 'string') {
try {
// eslint-disable-next-line no-new-func
data = (new Function('', `return ${data}`))(); // 高效解析,比eval安全些
} catch (e) {
console.log(e);
try {
data = JSON.parse(data); // 失败时(极少数情况),再尝试常规解析
} catch (e) {
console.log(e);
}
}
}
return data;
}
}