UNPKG

@sinosun/lib

Version:

sinosun jsbridge and net toolkit

529 lines (424 loc) 14.6 kB
"use strict"; /** * @author miaoju * !!! 里面部分方法需要子类api继承实现, @abstract 为可选重写,@virtual 为子类必须要重写实现的 !!! * 客户端请求api基础类 * 1、网络检查 * 2、用户信息header拼装 * 3、提供doGet、doPost接口 * 4、对于服务器返回结果resultCode,进行通用的错误码处理,具体的业务错误码在子类里面按业务处理 */ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise")); var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol")); var _iterator = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol/iterator")); var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property")); var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign")); var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int")); var _startsWith = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/starts-with")); var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = _promise["default"]))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = void 0 && (void 0).__generator || function (thisArg, body) { var _ = { label: 0, sent: function sent() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof _symbol["default"] === "function" && (g[_iterator["default"]] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) { try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = void 0 && (void 0).__importDefault || function (mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; (0, _defineProperty["default"])(exports, "__esModule", { value: true }); var NetAdapter_1 = __importDefault(require("./NetAdapter")); var BaseResponse_1 = __importDefault(require("./BaseResponse")); var CommErrorCode_1 = require("./CommErrorCode"); var REQUEST_METHOD = { "GET": "get", "POST": "post" }; /** * 是否空字符串 * @param obj */ function isEmptyStr(obj) { if (typeof obj === "undefined" || obj === null || obj === "") { return true; } else { return false; } } var BaseApi = /** @class */ function () { function BaseApi() {} /** * get请求 * @param {*} url 请求相对地址,可以不要域名、端口 * @param {*} params * @param {*} needLogin */ BaseApi.prototype.doGet = function (url, params, needLogin, timeout) { if (needLogin === void 0) { needLogin = true; } if (timeout === void 0) { timeout = 30000; } return this.doRequest(url, params, REQUEST_METHOD.GET, needLogin, timeout); }; /** * post 请求 * @param {*} url 请求相对地址,可以不要域名、端口 * @param {*} params * @param {*} needLogin */ BaseApi.prototype.doPost = function (url, params, needLogin, timeout) { if (needLogin === void 0) { needLogin = true; } if (timeout === void 0) { timeout = 30000; } return this.doRequest(url, params, REQUEST_METHOD.POST, needLogin, timeout); }; /** * 发送请求 * @param {*} url 请求相对地址,可以不要域名、端口 * @param {*} params * @param {*} header * @param {*} method */ BaseApi.prototype.doRequest = function (url, params, method, needLogin, timeout) { var _this = this; if (needLogin === void 0) { needLogin = true; } if (timeout === void 0) { timeout = 30000; } // 把url、params放在response里面带回给界面调用处,可能会有用处 var reqToResponse = { url: url, reqParams: params }; return new _promise["default"](function (res, rej) { // 不管网络层返回的正常还是异常,在这里统一转换成 {@link BaseResponse} 对象抛给上层处理 _this.checkNetWork().then(function (data) { // serviceName if (data && data["contectState"]) { return; } else { throw new Error("" + CommErrorCode_1.CommErrorCode.NETWORK_ERROR); } }).then(function (res) { return __awaiter(_this, void 0, void 0, function () { var header; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/ , this.dealRequestHeader(needLogin, url, params)]; case 1: header = _a.sent(); return [4 /*yield*/ , this.dealRequestParams(params, url, needLogin)]; case 2: // 封装请求参数 params = _a.sent(); // 发起请求 return [2 /*return*/ , NetAdapter_1["default"].doRequest(url, params, header, method, timeout)]; } }); }); }).then(function (result) { // 网络请求成功 result.request = reqToResponse; var baseResponse = _this.dealResponse(result); res(baseResponse); })["catch"](function (error) { // error : { code, message, httpCode, responseMessage} // 网络请求失败 var result = error; if (error) { // error 可能出现 undefined 的情况(如函数执行中出错了) result = (0, _assign["default"])(error, reqToResponse); } var baseResponse = _this.dealRequestException(result); rej(baseResponse); }); }); }; /** * 检查网络状态,默认不检查直接返回true,业务可根据需要重写 * @returns */ BaseApi.prototype.checkNetWork = function () { return new _promise["default"](function (res, rej) { res({ contectState: true }); }); }; /** * 封装网络请求header,默认返回空对象,业务可根据需要填入token、channelId等信息 * @param needLogin * @param url * @param params * @returns */ BaseApi.prototype.dealRequestHeader = function (needLogin, // token: any, // channelId: any, url, params) { if (needLogin === void 0) { needLogin = true; } return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/ , {}]; }); }); }; /** * 封装网络请求参数,默认直接返回params对象,业务可根据需要填入用户信息等参数 * @param params * @param url * @param needLogin * @returns */ BaseApi.prototype.dealRequestParams = function (params, url, needLogin) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/ , params]; }); }); }; /** * 处理服务器返回结果,只处理通用的业务错误码 * @param result */ BaseApi.prototype.dealResponse = function (result) { var bRes = new BaseResponse_1["default"](result.resultCode, // resultCode 基础接口协议的异常码 '', result.resultMessage // resultMessage 基础接口协议的异常描述 ); // 如果业务不成功,在这里进行一次通用错误码转换 bRes.request = result["request"]; if (!bRes.isSuccess()) { bRes.resultMessage = result.resultMessage; bRes.resultDesc = this.transferErrorCode(bRes.resultCode, bRes.resultMessage, bRes.resultDesc); // 后端返回错误依然需要返回结果数据方便前端根据错误展示 bRes.result = result["result"]; } // 业务成功, 把result数据结果放进去 else { bRes.result = this.tranferResultModel(result); } return bRes; }; /** * 把网络层的错误信息也转换成BaseResponse,然后抛给上层 * @param error */ BaseApi.prototype.dealRequestException = function (error) { // TODO 根据error来设置errorCode,以及 resultDesc var errorCode = 0; var errorMessage = ''; if (!error) { // error 为 undefined 或其他不明情况 errorCode = CommErrorCode_1.CommErrorCode.UNKNOWN_ERROR; } else { errorCode = error.code || CommErrorCode_1.CommErrorCode.UNKNOWN_ERROR; errorMessage = error.message || error.responseMessage || ""; } var errRes = new BaseResponse_1["default"](errorCode); // 把异常信息通过 error字段带到上层去 errRes = (0, _assign["default"])(errRes, { error: error }); errRes.resultDesc = this.transferErrorCode(errRes.resultCode, errorMessage, ""); console.log("dealRequestException - e : ", errRes); return errRes; }; /** * BaseApi这一层只处理跟网络、用户授权等相关的最基础错误码转换,具体的业务错误码在子类的api里面去转换 * @param resultCode * @abstract 子类可重写 */ BaseApi.prototype.transferCommErrorCode = function (resultCode, resultMessage, resultDesc) { // 只返回通用异常错误码信息,其他的code返回“”,由业务自己处理 // 如果是mPaaS 网关异常,把mPaaS错误信息直接拿出来: if ((0, _parseInt2["default"])(resultCode) == CommErrorCode_1.CommErrorCode.MPAAS_RPC_ERROR && resultMessage) { return resultMessage; } return CommErrorCode_1.CommErrorCodeDesc[resultCode] || ""; }; /** * 处理业务错误码 * @virtual BaseApi中这是一个抽象方法,由子类具体的业务api去实现自己的业务错误码 * @param resultCode */ BaseApi.prototype.transferBisErrorCode = function (resultCode) { return ""; }; // ---------- 错误码处理 start ---------------------------------------------------------------------// BaseApi.prototype.transferErrorCode = function (resultCode, resultMessage, resultDesc // url: string ) { // 1、先处理通用错误码,如果返回空,可能是业务错误码,进入 2 var msg = this.transferCommErrorCode(resultCode, resultMessage, resultDesc); // 2、处理业务错误码(如果通用错误码没有匹配到,则调用业务错误码转换) if (isEmptyStr(msg)) { // transferBisErrorCode 业务子类应该要重写该方法来转换业务自己的错误码信息 msg = this.transferBisErrorCode(resultCode); } // 3、通用、业务错误码都没有查询到,就给默认异常提示 if (isEmptyStr(msg)) { msg = this.transferDefaultExceptionDesc() + '[' + resultCode + ']'; } // 提示异常信息 // this.showMessage(url, msg); return msg; }; /** * @abstract 提示异常信息,业务api内部可重写决定 * @param url * @param msg */ BaseApi.prototype.showMessage = function (url, msg) {// if (msg) showToast(msg); }; /** * 返回默认的错误提示 * @abstract 子类Api可以重写, 如果通用、业务错误码都没找到,就用这个 */ BaseApi.prototype.transferDefaultExceptionDesc = function () { return "请求异常,请稍后重试!"; }; /** * 转换成本地业务api的model * @virtual 具体的转换在子类继承去处理,这里默认只是把result对象塞进去 * !!! 原则是只要response含有业务数据对象,就应该进行本地model映射 !!! */ BaseApi.prototype.tranferResultModel = function (result) { return result["result"]; }; /** * 转换成完整路径URL * @param url */ BaseApi.prototype.getFullUrl = function (url) { if (!((0, _startsWith["default"])(url).call(url, "https://") || (0, _startsWith["default"])(url).call(url, "http://"))) { url = location.origin + ((0, _startsWith["default"])(url).call(url, "/") ? "" : "/") + url; } return url; }; return BaseApi; }(); exports["default"] = BaseApi;