AJAXHelper.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import APIClient from './APIClient';
  2. import userDataStorage from '../userDataStorage';
  3. import Utils from '../Utils';
  4. class AJAXHelper {
  5. constructor() { }
  6. static genMockDataUrl(name) {
  7. let config = require('../../res/values/api.json');
  8. return config.mock_url + name + '.json';
  9. }
  10. static genAPIUrl(path, method, data) {
  11. const cfg = require('../../res/values/api.json');
  12. if (method == 'GET' && data) {
  13. let queryStrArr = [];
  14. for (let key in data) {
  15. queryStrArr.push(`${key}=${data[key]}`);
  16. }
  17. return `${cfg.api_url}${path}?${queryStrArr.join('&')}`;
  18. } else {
  19. return `${cfg.api_url}${path}`;
  20. }
  21. }
  22. static whenAJAXResponse(url, method, data, httpRequest, callback) {
  23. if (httpRequest.readyState != 4) {
  24. return;
  25. }
  26. let res = JSON.parse(httpRequest.responseText);
  27. // Token失效,使用deviceCode刷新Token后再继续请求
  28. if (res.code === 31003) {
  29. const params = { deviceCode: localStorage.getItem('deviceCode') };
  30. AJAXHelper.put('/token', params, (isTrue, res) => {
  31. if (!isTrue) return;
  32. if (!res.success) return;
  33. userDataStorage.setData(res.data);
  34. AJAXHelper.request(url, method, data, callback);
  35. });
  36. } else {
  37. callback(httpRequest.status == 200, res);
  38. }
  39. }
  40. static request(path, method, data, callback) {
  41. //读取本地用户信息,生成本次请求所需参数
  42. const { token = '', uid = '', eid = '' } = userDataStorage.getData() || {};
  43. const forSignStr = `path=${path}&uid=${uid}&eid=${eid}&${token}`;
  44. const sign = CryptoJS.MD5(forSignStr).toString();
  45. const requestId = Utils.uuid(32, 16);
  46. //判断当前平台
  47. let platform = 'tv';
  48. if (!window.efunbox) {
  49. platform = 'web';
  50. }
  51. let url = AJAXHelper.genAPIUrl(path, method, { eid, uid, terminal: platform, ...data });
  52. let xmlHttpReq = new XMLHttpRequest();
  53. xmlHttpReq.open(method, url, true);
  54. //构造请求头(每个请求都带的公共参数)
  55. xmlHttpReq.setRequestHeader('eid', eid);
  56. xmlHttpReq.setRequestHeader('uid', uid);
  57. xmlHttpReq.setRequestHeader('sign', sign);
  58. xmlHttpReq.setRequestHeader('terminal', platform);
  59. xmlHttpReq.setRequestHeader('merchant', 'baby');
  60. xmlHttpReq.setRequestHeader('requestId', requestId);
  61. xmlHttpReq.setRequestHeader('Authentication', sign); //header中增加Authentication以兼容老版本
  62. xmlHttpReq.setRequestHeader('Content-Type', 'application/' + (method == 'POST' || method == 'PUT' ? 'json' : 'text'));
  63. //构造请求体
  64. let sendBody = null;
  65. if (data && (method == 'POST' || method == 'PUT')) {
  66. sendBody = JSON.stringify({ eid, uid, terminal: platform, ...data });
  67. }
  68. //收到响应回调处理
  69. xmlHttpReq.onreadystatechange = function () {
  70. AJAXHelper.whenAJAXResponse(path, method, data, xmlHttpReq, callback);
  71. };
  72. //发送请求
  73. xmlHttpReq.send(sendBody);
  74. }
  75. static get(path, params, callback) {
  76. AJAXHelper.request(path, 'GET', params, callback);
  77. }
  78. static delete(path, params, callback) {
  79. AJAXHelper.request(path, 'DELETE', params, callback);
  80. }
  81. static post(path, params, callback) {
  82. AJAXHelper.request(path, 'POST', params, callback);
  83. }
  84. static put(path, params, callback) {
  85. AJAXHelper.request(path, 'PUT', params, callback);
  86. }
  87. }
  88. module.exports = AJAXHelper;