|
|
var constants = require('./constants');
|
|
|
var utils = require('./utils');
|
|
|
var Session = require('./session');
|
|
|
var loginLib = require('./login');
|
|
|
|
|
|
var noop = function noop() {};
|
|
|
|
|
|
var buildSessionHeader = function buildSessionHeader() {
|
|
|
var session = Session.get();
|
|
|
var header = {};
|
|
|
|
|
|
if (session && session.id && session.skey) {
|
|
|
header[constants.WX_HEADER_ID] = session.id;
|
|
|
header[constants.WX_HEADER_SKEY] = session.skey;
|
|
|
}
|
|
|
|
|
|
return header;
|
|
|
};
|
|
|
|
|
|
/***
|
|
|
* @class
|
|
|
* 表示请求过程中发生的异常
|
|
|
*/
|
|
|
var RequestError = (function () {
|
|
|
function RequestError(type, message) {
|
|
|
Error.call(this, message);
|
|
|
this.type = type;
|
|
|
this.message = message;
|
|
|
}
|
|
|
|
|
|
RequestError.prototype = new Error();
|
|
|
RequestError.prototype.constructor = RequestError;
|
|
|
|
|
|
return RequestError;
|
|
|
})();
|
|
|
|
|
|
function request(options) {
|
|
|
if (typeof options !== 'object') {
|
|
|
var message = '请求传参应为 object 类型,但实际传了 ' + (typeof options) + ' 类型';
|
|
|
throw new RequestError(constants.ERR_INVALID_PARAMS, message);
|
|
|
}
|
|
|
|
|
|
var requireLogin = options.login;
|
|
|
var success = options.success || noop;
|
|
|
var fail = options.fail || noop;
|
|
|
var complete = options.complete || noop;
|
|
|
var originHeader = options.header || {};
|
|
|
|
|
|
// 成功回调
|
|
|
var callSuccess = function () {
|
|
|
success.apply(null, arguments);
|
|
|
complete.apply(null, arguments);
|
|
|
};
|
|
|
|
|
|
// 失败回调
|
|
|
var callFail = function (error) {
|
|
|
fail.call(null, error);
|
|
|
complete.call(null, error);
|
|
|
};
|
|
|
|
|
|
// 是否已经进行过重试
|
|
|
var hasRetried = false;
|
|
|
|
|
|
if (requireLogin) {
|
|
|
doRequestWithLogin();
|
|
|
} else {
|
|
|
doRequest();
|
|
|
}
|
|
|
|
|
|
// 登录后再请求
|
|
|
function doRequestWithLogin() {
|
|
|
loginLib.login({ success: doRequest, fail: callFail });
|
|
|
}
|
|
|
|
|
|
// 实际进行请求的方法
|
|
|
function doRequest() {
|
|
|
var authHeader = buildSessionHeader();
|
|
|
|
|
|
wx.request(utils.extend({}, options, {
|
|
|
header: utils.extend({}, originHeader, authHeader),
|
|
|
|
|
|
success: function (response) {
|
|
|
var data = response.data;
|
|
|
|
|
|
// 如果响应的数据里面包含 SDK Magic ID,表示被服务端 SDK 处理过,此时一定包含登录态失败的信息
|
|
|
if (data && data[constants.WX_SESSION_MAGIC_ID]) {
|
|
|
// 清除登录态
|
|
|
Session.clear();
|
|
|
|
|
|
var error, message;
|
|
|
if (data.error === constants.ERR_INVALID_SESSION) {
|
|
|
// 如果是登录态无效,并且还没重试过,会尝试登录后刷新凭据重新请求
|
|
|
if (!hasRetried) {
|
|
|
hasRetried = true;
|
|
|
doRequestWithLogin();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
message = '登录态已过期';
|
|
|
error = new RequestError(data.error, message);
|
|
|
|
|
|
} else {
|
|
|
message = '鉴权服务器检查登录态发生错误(' + (data.error || 'OTHER') + '):' + (data.message || '未知错误');
|
|
|
error = new RequestError(constants.ERR_CHECK_LOGIN_FAILED, message);
|
|
|
}
|
|
|
|
|
|
callFail(error);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
callSuccess.apply(null, arguments);
|
|
|
},
|
|
|
|
|
|
fail: callFail,
|
|
|
complete: noop,
|
|
|
}));
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
RequestError: RequestError,
|
|
|
request: request,
|
|
|
buildSessionHeader: buildSessionHeader
|
|
|
}; |