UNPKG

framework4js

Version:

Framework-for-js is a better Javascript's framework

502 lines (481 loc) 19.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _Service2 = _interopRequireDefault(require("./Service")); var _RESTful = _interopRequireDefault(require("../spanners/RESTful")); var _Exception = _interopRequireDefault(require("../spanners/Exception")); var _Lib = _interopRequireDefault(require("../spanners/Lib")); var _qs = _interopRequireDefault(require("qs")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /** * Class HttpService */ var HttpService = /*#__PURE__*/function (_Service) { (0, _inherits2["default"])(HttpService, _Service); var _super = _createSuper(HttpService); /** * _contentType Request type 请求类型 * 'application/json' 为 Request Payload 请求方式 * 'application/x-www-form-urlencoded;charset=UTF-8' 为 Form Data 请求方式 需QS配合使用 * OTHER Query String Parameters 为 _method = 'GET' */ // _contentType = 'application/json'; /** * Constructor * @param {Object} app * @param {Object} HTTP_ADAPTER_ * @param {String} HTTP_API * @param {String} HTTP_HOST * @param {Boolean} IS_RESTFUL * @param {String} CONTENT_TYPE * @param {Object} DATA_CARRYING * @param {Function} REQUEST_MIDDLEWARE * @param {Function} RESPONSE_MIDDLEWARE */ function HttpService(app, _ref) { var _this; var HTTP_ADAPTER_ = _ref.HTTP_ADAPTER_, HTTP_API = _ref.HTTP_API, HTTP_HOST = _ref.HTTP_HOST, IS_RESTFUL = _ref.IS_RESTFUL, CONTENT_TYPE = _ref.CONTENT_TYPE, DATA_CARRYING = _ref.DATA_CARRYING, REQUEST_MIDDLEWARE = _ref.REQUEST_MIDDLEWARE, RESPONSE_MIDDLEWARE = _ref.RESPONSE_MIDDLEWARE; (0, _classCallCheck2["default"])(this, HttpService); _this = _super.call(this, app); // Setting http adapter (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_http", null); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_api", null); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_headers", {}); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_host", ""); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isRESTful", true); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_RESTful", function () {}); // Carrying data (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_carryingData", {}); // mode (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_mode", "REQUEST_PAYLOAD"); // $helper (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "$helper", null); _this._http = HTTP_ADAPTER_ || _this._http; // Setting http api _this._api = HTTP_API || _this._api; // Setting host _this._host = HTTP_HOST || _this._host; // Is used RESTful _this._isRESTful = IS_RESTFUL || true; // import RESTful from '../spanners/RESTful'; _this._RESTful = _RESTful["default"] || null; // Setting Content-type _this.setContentType(CONTENT_TYPE); // Setting Data-carrying 携带数据 _this.setDataCarry(DATA_CARRYING["REQUEST_HEADERS"], DATA_CARRYING["REQUEST_DATA"]); // Setting request middleware 请求中间件 _this._requestMiddleware = _Lib["default"].isFunction(REQUEST_MIDDLEWARE) ? REQUEST_MIDDLEWARE : function (request) { return request; }; // Setting response middleware 响应中间件 _this._responseMiddleware = _Lib["default"].isFunction(RESPONSE_MIDDLEWARE) ? RESPONSE_MIDDLEWARE : function (response) { return response; }; return _this; } /** * Method setContentType 设置请求类型 * @param {String} mode */ (0, _createClass2["default"])(HttpService, [{ key: "setContentType", value: function setContentType(mode) { if (mode === "REQUEST_PAYLOAD") { this._mode = mode; // REQUEST_PAYLOAD this.setHeader("Content-Type", "application/json"); } else if (mode === "FORM_DATA") { this._mode = mode; // FORM_DATA this.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); } } /** * Method setDataCarry 处理携带数据 * @param {*} REQUEST_HEADERS * @param {*} REQUEST_DATA */ }, { key: "setDataCarry", value: function setDataCarry(REQUEST_HEADERS, REQUEST_DATA) { var _this2 = this; if (REQUEST_HEADERS) { var headers = Object.keys(REQUEST_HEADERS); if (Array.isArray(headers)) { headers.map(function (name) { _this2.carryingHandle(name, REQUEST_HEADERS[name], "REQUEST_HEADERS"); }); } } if (REQUEST_DATA) { var data = Object.keys(REQUEST_DATA); if (Array.isArray(data)) { data.map(function (name) { _this2.carryingHandle(name, REQUEST_DATA[name], "REQUEST_DATA"); }); } } } /** * Method carryingHandle 携带数据处理 * @param {String} name * @param {*} val * @param {*} type */ }, { key: "carryingHandle", value: function carryingHandle(name, val) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "REQUEST_HEADERS"; if (name && val) { if (_Lib["default"].isFunction(val)) { if (type === "REQUEST_HEADERS") { this.setHeader(name, val()); } else if (type === "REQUEST_DATA") { this.setData(name, val()); } } else { var str = null; // Get type if (val === "LOCAL") { str = this.app.get("$helper").local(name); } else if (val === "SESSION") { str = this.app.get("$helper").session(name); } else if (val === "COOKIES") { str = this.app.get("$helper").cookies(name); } else if (val === "STORAGE") { // UNIAPP str = this.app.get("$helper").storage(name); } if (type === "REQUEST_HEADERS") { this.setHeader(name, str); } else if (type === "REQUEST_DATA") { this.setData(name, str); } } } } /** * Method http 发送一个请求 * @param {String} apiRoute * @param {JSON} data * @param {Boolean} returnResponse * @returns */ }, { key: "http", value: function () { var _http = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(apiRoute, data) { var returnResponse, config, _args = arguments; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: returnResponse = _args.length > 2 && _args[2] !== undefined ? _args[2] : false; try { // Setting config parameters config = _objectSpread(_objectSpread({}, this.getParameters(apiRoute, data)), { headers: this._headers }); // Run request middleware config = this._requestMiddleware(config); this._http.setConfig(config); } catch (e) { console.warn("Request config warn", error); } // Throw Exception _context.prev = 2; _context.next = 5; return this.request(returnResponse); case 5: return _context.abrupt("return", _context.sent); case 8: _context.prev = 8; _context.t0 = _context["catch"](2); console.warn("Request interceptor warn", _context.t0); case 11: case "end": return _context.stop(); } }, _callee, this, [[2, 8]]); })); function http(_x, _x2) { return _http.apply(this, arguments); } return http; }() /** * Send Request * @param {Boolean} returnResponse * @returns {Promise<*|*>} */ }, { key: "request", value: function () { var _request = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(returnResponse) { var response; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return this._http.request(); case 3: response = _context2.sent; // Run response middleware try { this._responseMiddleware(response); } catch (error) { console.warn("Response middleware Error", error); } return _context2.abrupt("return", !returnResponse ? response.data : response); case 8: _context2.prev = 8; _context2.t0 = _context2["catch"](0); if (!(_context2.t0 && _context2.t0.response)) { _context2.next = 37; break; } _context2.t1 = _context2.t0.response.status; _context2.next = _context2.t1 === 400 ? 14 : _context2.t1 === 401 ? 16 : _context2.t1 === 403 ? 18 : _context2.t1 === 404 ? 20 : _context2.t1 === 408 ? 22 : _context2.t1 === 500 ? 24 : _context2.t1 === 501 ? 26 : _context2.t1 === 502 ? 28 : _context2.t1 === 503 ? 30 : _context2.t1 === 504 ? 32 : _context2.t1 === 505 ? 34 : 36; break; case 14: _context2.t0.message = "请求参数错误"; return _context2.abrupt("break", 37); case 16: _context2.t0.message = "未授权,请登录"; return _context2.abrupt("break", 37); case 18: _context2.t0.message = "跨域拒绝访问"; return _context2.abrupt("break", 37); case 20: _context2.t0.message = "\u8BF7\u6C42\u5730\u5740\u51FA\u9519: ".concat(_context2.t0.response.config.url); return _context2.abrupt("break", 37); case 22: _context2.t0.message = "请求超时"; return _context2.abrupt("break", 37); case 24: _context2.t0.message = "服务器内部错误"; return _context2.abrupt("break", 37); case 26: _context2.t0.message = "服务未实现"; return _context2.abrupt("break", 37); case 28: _context2.t0.message = "网关错误"; return _context2.abrupt("break", 37); case 30: _context2.t0.message = "服务不可用"; return _context2.abrupt("break", 37); case 32: _context2.t0.message = "网关超时"; return _context2.abrupt("break", 37); case 34: _context2.t0.message = "HTTP版本不受支持"; return _context2.abrupt("break", 37); case 36: return _context2.abrupt("break", 37); case 37: // Response middleware this._responseMiddleware(_objectSpread(_objectSpread({}, _context2.t0.response), { message: _context2.t0.message })); throw _context2.t0; case 39: case "end": return _context2.stop(); } }, _callee2, this, [[0, 8]]); })); function request(_x3) { return _request.apply(this, arguments); } return request; }() /** * Method Send 发送一个自定义请求 * @param apiRoute * @param data * @param config * @returns {Promise<void>} */ }, { key: "send", value: function () { var _send = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(apiRoute, data) { var config, _args3 = arguments; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: config = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {}; // Host if (config.host) { this._host = config.host; } // Headers if (config.headers) { this.setHeaders(config.headers); } // Mode if (config.mode) { this.setContentType(config.mode); } _context3.next = 6; return this.http(apiRoute, data, true); case 6: return _context3.abrupt("return", _context3.sent); case 7: case "end": return _context3.stop(); } }, _callee3, this); })); function send(_x4, _x5) { return _send.apply(this, arguments); } return send; }() /** * Method getParameters 从Api里读取请求方法、参数和地址 * @param {*} apiRoute * @param {*} data * @returns */ }, { key: "getParameters", value: function getParameters(apiRoute, data) { var routeParams = this._api[apiRoute]; // ApiRoute does not exist if (!routeParams && !apiRoute) { throw new _Exception["default"]("The api route does not exist", "ApiRouteError"); } else if (!routeParams && apiRoute) { routeParams = [apiRoute]; } var uri = null; var method = "post"; var needAuth = true; // Parameters handle switch (routeParams.length) { case 1: uri = routeParams[0]; break; case 2: uri = routeParams[0]; method = routeParams[1]; break; case 3: uri = routeParams[0]; method = routeParams[1]; needAuth = routeParams[2]; break; default: throw new _Exception["default"]("The api route does not exist", "ApiRouteError"); } // toUpperCase method = method.toUpperCase(); // Transformer Data var tfData = this.transformRESTfulData(uri, data); // console.log('tfData_', tfData); // Carrying data if (Object.keys(this._carryingData).length > 0 && needAuth) { tfData.data = _objectSpread(_objectSpread({}, this._carryingData), tfData.data); } var objData = tfData.data; // console.log('tfData.data', tfData.data, tfData) var url = _Lib["default"].strTrim(this._host, "/") + "/" + _Lib["default"].strTrim(tfData.uri, "/"); // FORM_DATA QS.stringify if (this._mode === "FORM_DATA" || method === "GET") { tfData.data = _qs["default"].stringify(tfData.data); } if (method === "GET") { // const requestUri = qs.stringify(data); // 此处改为 qs.stringify(tfData.data); var requestUri = tfData.data; url = requestUri ? url + "?" + requestUri : url; // console.log('XHR', url); } return { url: url, method: method, data: tfData.data, auth: needAuth, params: { host: _Lib["default"].strTrim(this._host), method: method, uri: _Lib["default"].strTrim(tfData.uri), data: objData, auth: needAuth } }; } /** * Method transformRESTfulData 使用扳手工具处理RESTful数据 * @param {*} uri * @param {*} data * @returns */ }, { key: "transformRESTfulData", value: function transformRESTfulData(uri) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // RESTful handle RESRful 处理 return new this._RESTful(uri, data, this._isRESTful); } /** * Method setHeaders 设置Headers multiple * @param {JSON|Object} config */ }, { key: "setHeaders", value: function setHeaders() { var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this._headers = _objectSpread(_objectSpread({}, this._headers), config); } /** * Method setHeader 设置Headers single * @param {String} name * @param {String} val */ }, { key: "setHeader", value: function setHeader(name, val) { this._headers[name] = val; } /** * Method setData 设置携带数据 通过Data * @param {*} name * @param {*} val */ }, { key: "setData", value: function setData(name, val) { this._carryingData[name] = val; } // responseStatus(errStatus) { // // } }]); return HttpService; }(_Service2["default"]); exports["default"] = HttpService;