UNPKG

t-comm

Version:

专业、稳定、纯粹的工具库

150 lines (143 loc) 5.11 kB
'use strict'; 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;