import APIClient from './APIClient'; import userDataStorage from '../userDataStorage'; import Utils from '../Utils'; class AJAXHelper { constructor() { } static genMockDataUrl(name) { let config = require('../../res/values/api.json'); return config.mock_url + name + '.json'; } static genAPIUrl(path, method, data) { const cfg = require('../../res/values/api.json'); if (method == 'GET' && data) { let queryStrArr = []; for (let key in data) { queryStrArr.push(`${key}=${data[key]}`); } return `${cfg.api_url}${path}?${queryStrArr.join('&')}`; } else { return `${cfg.api_url}${path}`; } } static whenAJAXResponse(url, method, data, httpRequest, callback) { if (httpRequest.readyState != 4) { return; } let res = JSON.parse(httpRequest.responseText); // Token失效,使用deviceCode刷新Token后再继续请求 if (res.code === 31003) { const params = { deviceCode: localStorage.getItem('deviceCode') }; AJAXHelper.put('/token', params, (isTrue, res) => { if (!isTrue) return; if (!res.success) return; userDataStorage.setData(res.data); AJAXHelper.request(url, method, data, callback); }); } else { callback(httpRequest.status == 200, res); } } static request(path, method, data, callback) { //读取本地用户信息,生成本次请求所需参数 const { token = '', uid = '', eid = '' } = userDataStorage.getData() || {}; const forSignStr = `path=${path}&uid=${uid}&eid=${eid}&${token}`; const sign = CryptoJS.MD5(forSignStr).toString(); const requestId = Utils.uuid(32, 16); //判断当前平台 let platform = 'tv'; if (!window.efunbox) { platform = 'web'; } let url = AJAXHelper.genAPIUrl(path, method, { eid, uid, terminal: platform, ...data }); let xmlHttpReq = new XMLHttpRequest(); xmlHttpReq.open(method, url, true); //构造请求头(每个请求都带的公共参数) xmlHttpReq.setRequestHeader('eid', eid); xmlHttpReq.setRequestHeader('uid', uid); xmlHttpReq.setRequestHeader('sign', sign); xmlHttpReq.setRequestHeader('terminal', platform); xmlHttpReq.setRequestHeader('merchant', 'baby'); xmlHttpReq.setRequestHeader('requestId', requestId); xmlHttpReq.setRequestHeader('Authentication', sign); //header中增加Authentication以兼容老版本 xmlHttpReq.setRequestHeader('Content-Type', 'application/' + (method == 'POST' || method == 'PUT' ? 'json' : 'text')); //构造请求体 let sendBody = null; if (data && (method == 'POST' || method == 'PUT')) { sendBody = JSON.stringify({ eid, uid, terminal: platform, ...data }); } //收到响应回调处理 xmlHttpReq.onreadystatechange = function () { AJAXHelper.whenAJAXResponse(path, method, data, xmlHttpReq, callback); }; //发送请求 xmlHttpReq.send(sendBody); } static get(path, params, callback) { AJAXHelper.request(path, 'GET', params, callback); } static delete(path, params, callback) { AJAXHelper.request(path, 'DELETE', params, callback); } static post(path, params, callback) { AJAXHelper.request(path, 'POST', params, callback); } static put(path, params, callback) { AJAXHelper.request(path, 'PUT', params, callback); } } module.exports = AJAXHelper;