t-comm
Version:
专业、稳定、纯粹的工具库
150 lines (143 loc) • 5.11 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var _typeof = require('@babel/runtime/helpers/typeof');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof);
/** 构造大小写不敏感的 getHeader(针对普通 object header) */
function makeCaseInsensitiveGetter(headerObj) {
var map = {};
if (headerObj) {
Object.keys(headerObj).forEach(function (k) {
map[k.toLowerCase()] = String(headerObj[k]);
});
}
return function (name) {
return map[name.toLowerCase()];
};
}
/** 是否处于 H5(浏览器)环境 */
function isH5Env() {
return typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.fetch === 'function';
}
/** 把任意类型的 body 序列化成 query string */
function toQueryString(body) {
if (body === null || body === undefined) return '';
if (typeof body === 'string') return body;
var usp = new URLSearchParams();
Object.keys(body).forEach(function (k) {
var v = body[k];
if (v === null || v === undefined) return;
usp.append(k, _typeof__default["default"](v) === 'object' ? JSON.stringify(v) : String(v));
});
return usp.toString();
}
/** 拼接 url 与 query */
function appendQuery(url, qs) {
if (!qs) return url;
return url + (url.includes('?') ? '&' : '?') + qs;
}
/** 把 fetch Headers 转成普通对象,给 makeCaseInsensitiveGetter 复用 */
function headersToObject(headers) {
var obj = {};
headers.forEach(function (value, key) {
obj[key] = value;
});
return obj;
}
/**
* 使用原生 fetch 发起请求(H5 环境兜底)
*
* 把 fetch 的响应/错误统一包装成 IRawResponse,业务侧无感知。
* 不依赖 axios,避免被 Cocos 小游戏构建打进产物。
*/
function doRequestByFetch(param) {
var _a;
var method = (param.method || 'POST').toUpperCase();
var header = param.header || {
'Content-Type': 'application/json'
};
var body = param.reqData;
var withCredentials = !!((_a = param.extra) === null || _a === void 0 ? void 0 : _a.withCredentials);
var useQuery = method === 'GET' || method === 'HEAD';
var url = useQuery ? appendQuery(param.url, toQueryString(body)) : param.url;
var init = {
method: method,
headers: header,
credentials: withCredentials ? 'include' : 'same-origin'
};
if (!useQuery && body !== null && body !== undefined) {
init.body = typeof body === 'string' ? body : JSON.stringify(body);
}
return fetch(url, init).then(function (res) {
return res.text().then(function (text) {
// 尝试按 JSON 解析,失败则回退到原文本
var data = null;
if (text) {
try {
data = JSON.parse(text);
} catch (_a) {
data = text;
}
}
var result = {
status: res.status,
ok: res.status >= 200 && res.status < 300,
data: data,
statusText: res.statusText || '',
getHeader: makeCaseInsensitiveGetter(headersToObject(res.headers))
};
return result;
});
})["catch"](function (err) {
// 网络层错误(DNS、断网、CORS 等):抛出去,等价 wx.request 的 fail
throw new Error((err === null || err === void 0 ? void 0 : err.message) || 'fetch request failed');
});
}
/**
* 统一的底层请求发送
*
* - 优先使用微信小游戏环境(wx.request)
* - 否则若处于 H5(浏览器)环境,则使用原生 fetch 兜底
* - 两者都不满足再 reject,让业务方明确感知
*
* 不做业务逻辑,只负责把 IRawRequest 发出去,包成 IRawResponse 返回
*/
function doRequest(param) {
var method = param.method || 'POST';
var header = param.header || {
'Content-Type': 'application/json'
};
var body = param.reqData;
// 1) 微信小游戏环境:优先使用 wx.request
if (typeof wx !== 'undefined' && wx && typeof wx.request === 'function') {
return new Promise(function (resolve, reject) {
wx.request({
url: param.url,
method: method,
header: header,
data: body,
dataType: 'json',
success: function success(res) {
var status = res.statusCode;
resolve({
status: status,
ok: status >= 200 && status < 300,
data: res.data,
statusText: res.errMsg || '',
getHeader: makeCaseInsensitiveGetter(res.header)
});
},
fail: function fail(err) {
reject(new Error((err === null || err === void 0 ? void 0 : err.errMsg) || 'wx.request failed'));
}
});
});
}
// 2) H5(浏览器)环境:用原生 fetch 兜底
if (isH5Env()) {
return doRequestByFetch(param);
}
// 3) 其他环境(Node / 未识别):明确报错
return Promise.reject(new Error('[pmd-api-cocos/network] 当前环境不支持请求,' + '既不是微信小游戏(wx.request),也不是 H5(window)环境'));
}
exports.doRequest = doRequest;