framework4js
Version:
Framework-for-js is a better Javascript's framework
502 lines (481 loc) • 19.7 kB
JavaScript
"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;