SourceTermAnalysisSystem_vue/public/worker/fetchHttp.js

244 lines
6.3 KiB
JavaScript
Raw Normal View History

2026-05-15 10:13:06 +08:00
'use strict';
/**
* @description 利用set进行数组去重
* @param {*} arr 去重数组
*/
// 判断是否为空或未定义
function checkNull(str) {
if (str === null || str === undefined || str === '') {
if (str === 0) {
return true;
}
else {
return false;
}
}
else {
return true;
}
}
/**
* @description 检测是否有默认值
* @param {*} checkObj 键查对象
* @param {*} value 默认值
* @returns {object} 如果没有设置默认值 暂时为0
*/
function hasDefaultValue(checkObj, value) {
const falg = checkNull(checkObj);
if (!falg) {
return checkNull(value) ? value : 0;
}
return checkObj;
}
/**
* @description http请求业务模块的统一处理
*/
// ---------------------------------------------------内部方法---------------------------
/**
* @description get参数转码防止编码问题
* @param {string} key
* @param {string} value 键值
* @returns {Array}
*/
function GetParamsEncode(key, value) {
return [key, encodeURI(value)];
}
/**
* @description get请求参数处理
* @param {array || object} params 参数对象
* @returns array
*/
function GetParamsHandle(params) {
let pamarsO = [];
try {
if (Array.isArray(params)) {
params.forEach((ele) => {
pamarsO.push(GetParamsEncode(ele[0], ele[1]));
});
}
else if (params) {
Object.keys(params).forEach((key, index) => {
pamarsO.push(GetParamsEncode(key, params[key]));
});
}
else { }
return pamarsO;
}
catch (error) {
console.error('get请求url参数处理错误', error);
return pamarsO;
}
}
// ------------------------------------------------------方法结束----------------------------
/**
* @description 处理get请求参数的拼接
* @param {boolean} url 请求路径 url不为空返回 参数拼接API
* @param {object} params 参数
* @return {string || object}
*/
function handleParamsGet(url, params) {
let paramsArr = GetParamsHandle(params);
if (url.length > 0) {
let paramsArrs = paramsArr.map((ele) => {
return `${ele[0]}=${ele[1]}`;
});
return `${url}?${paramsArrs.join('&')}`;
}
else {
return '';
}
}
/**
* 处理post请求表单数据参数的拼接
* @param {object} params 参数
*/
function handleParamsFromData(params) {
let formData = new FormData();
Object.keys(params).forEach((key, index) => {
formData.append(key, params[key]);
});
return formData;
}
/**
* @description 封裝http請求实现多线程调用
*/
// -------内部方法--------------
/**
* @description 处理返回的数据
* @param {string} type 数据类型
* @param {object} response res对象
* @returns {object}
*/
function handleParamsResData(type, response) {
if (type.toUpperCase() == 'TEXT') {
// 文本
return response.text();
}
else if (type.toUpperCase() == 'JSON') {
// json
return response.json();
}
else if (type.toUpperCase() == 'FROMDATA') {
// 表单
return response.formData();
}
else if (type.toUpperCase() == 'BLOB') {
// blob
return response.blob();
}
else if (type.toUpperCase() == 'BUFFER') {
// 二进制流
return response.arrayBuffer();
}
else {
return response.text();
}
}
/**
* @descriptionc 处理fetch 参数
* @param {string} url 请求路径
* @param {object} parameter 参数
* @returns {object}
*/
function handleParamsFetch(url, parameter) {
// 处理参数
if (!parameter) {
parameter = {};
}
parameter.dataType = hasDefaultValue(parameter.dataType, 'json');
let fetOPt = {};
let headers = {};
// 处理请求模式
fetOPt.method = hasDefaultValue(parameter.method, 'GET').toUpperCase();
// 处理请求头
if (!parameter.headers) {
headers['Content-Type'] = hasDefaultValue(parameter.headers, 'application/json ');
}
if (parameter.token) {
headers['X-Access-Token'] = `${parameter.token}`; // Token 格式Bearer + 空格 + Token 值
}
fetOPt.headers = headers;
// 处理请求参数 后续添加
if (fetOPt.method === 'GET') {
url = handleParamsGet(url, parameter.params);
}
else {
// 暂且只处理 表单数据 json数据
if (parameter.params) {
// 表单方式
fetOPt.body = handleParamsFromData(parameter.params);
}
else {
// json方式
fetOPt.body = hasDefaultValue(parameter.data ? JSON.stringify(parameter.data) : undefined, {});
}
}
return {
url,
parameter,
fetOPt,
};
}
// -----------------------------------------------------内部方法结束--------------------------------------------
/**
* fetch 请求参数属性
* method: "GET",//请求的模式
headers: {//请求头
"Content-Type": "text/plain;charset=UTF-8"
},
body: undefined,//如何处理缓存
referrer: "about:client",//用于设定fetch()请求的referer标头
referrerPolicy: "no-referrer-when-downgrade",//属性用于设定Referer标头的规则。可能的取值如下
mode: "cors",//请求方式
credentials: "same-origin",//是否发送 Cookie
cache: "default",//如何处理缓存
redirect: "follow",//指定 HTTP 跳转的处理方法
integrity: "",//属性指定一个哈希值,用于检查 HTTP 回应传回的数据是否等于这个预先设定的哈希值
keepalive: false,//用于页面卸载时,告诉浏览器在后台保持连接,继续发送数据
signal: undefined//属性指定一个 AbortSignal 实例用于取消fetch()请求
*/
/**
* @deseription fetch请求
* @param {string} url 请求路径
* @param {object} parameter 请求参数
* parameter.dataType //数据类型 text json buffer defvalue= 'json'
* parameter.method //请求模式
* parameter.headers //请求头
* parameter.params //表单数据
* parameter.data //结构数据
* ...参数后期补充
* @param {Function} callBack 回调参数
* 当前只处理get post请求
*/
let fetchHttp = (url, parameter, callBack) => {
let handleObj = handleParamsFetch(url, parameter);
url = handleObj.url;
let fetOPt = handleObj.fetOPt;
// 开始请求
fetch(url, fetOPt).then((response) => {
if (response.ok) {
// 请求成功
if (callBack instanceof Function) {
let datas = handleParamsResData(parameter.dataType, response);
datas.then((data) => {
// 判定成功,传值
callBack(data);
});
}
}
else {
// 请求失败
console.log(response.statusText);
}
});
};