const Request…

打捞于2024-02-25 20:04 阅读2.36K NO.000657
const Request = async (o) => {
if (typeof o === 'string') o = { url: o };
if (!o?.url) throw new Error('[发送请求] 缺少 url 参数');

try {
// type => 因为env中使用method处理post的特殊请求(put/delete/patch), 所以这里使用type
const { url: u, type, headers = {}, body: b, params, dataType = 'form', deviceType = 'mobile', responseType = 'data' } = o;
// post请求需要处理params参数(get不需要, env已经处理)
const method = type ? type?.toLowerCase() : ('body' in o ? 'post' : 'get');
const url = u.concat(method === 'post' ? '?' + $.SakuraUtils.JsonToUrl(params) : '');
// 根据deviceType给headers添加默认UA
headers['User-Agent'] ||= (headers['User-Agent'] = deviceType === 'pc'
? 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1');
// 根据jsonType处理headers
if (dataType === 'json') headers['Content-Type'] = 'application/json;charset=UTF-8';
// post请求处理body
const body = method === 'post' && b ? (o.dataType === 'json' ? $.toStr(b) || b : typeof b === 'object' ? $.SakuraUtils.JsonToUrl(b) : b) : '';
const request = { url, headers, ...(method === 'post' && { body }), ...(method === 'get' && params && { params }) };

const httpPromise = $.http[method.toLowerCase()](request)
.then(response => responseType == 'data' ? response.body : response)
.then(res => $.toObj(res) || res)
.catch(err => err);
// 使用Promise.race来强行加入超时处理
return Promise.race([
new Promise((_, e) => setTimeout(() => e('当前请求已超时'), o?.timeout || 1e4)),
httpPromise
]);
} catch (e) {
throw e;
}
};

← 返回首页