api.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. (function () {
  2. 'use strict';
  3. var DEFAULT_ERROR_MESSAGE = 'Request failed';
  4. function getErrorMessage(result) {
  5. if (result && (typeof result.message === 'string' || typeof result.message === 'number')) {
  6. return String(result.message);
  7. }
  8. if (result && (typeof result.msg === 'string' || typeof result.msg === 'number')) {
  9. return String(result.msg);
  10. }
  11. return DEFAULT_ERROR_MESSAGE;
  12. }
  13. function isSuccessCode(code) {
  14. return code === 0 || code === 200 || code === '0' || code === '200';
  15. }
  16. function parseResponse(response) {
  17. return response.json().catch(function () {
  18. return { code: -1, message: DEFAULT_ERROR_MESSAGE };
  19. });
  20. }
  21. /**
  22. * 通用 API 请求封装,统一错误处理
  23. * @param {string} url 请求地址
  24. * @param {Object} [options] fetch 选项
  25. * @returns {Promise<any>} 成功时返回 data / result / 响应体
  26. */
  27. function request(url, options) {
  28. var fetchOptions = Object.assign({ credentials: 'include' }, options || {});
  29. return fetch(url, fetchOptions)
  30. .then(function (response) {
  31. return parseResponse(response).then(function (result) {
  32. var code = result && result.code;
  33. if (!response.ok || !isSuccessCode(code)) {
  34. var err = new Error(getErrorMessage(result));
  35. err.code = code != null ? code : (response.status || -1);
  36. err.status = response.status;
  37. err.data = result;
  38. throw err;
  39. }
  40. return result && (result.data !== undefined ? result.data : result.result !== undefined ? result.result : result);
  41. });
  42. })
  43. .catch(function (err) {
  44. if (err && err.message) {
  45. throw err;
  46. }
  47. var fallback = new Error(DEFAULT_ERROR_MESSAGE);
  48. fallback.code = -1;
  49. throw fallback;
  50. });
  51. }
  52. /**
  53. * 带鉴权头的请求,自动注入当前 token
  54. * @param {string} url 请求地址
  55. * @param {Object} [options] fetch 选项
  56. * @param {string} [token] 可选 token,默认使用 window.WELFARE_TOKEN
  57. * @returns {Promise<any>}
  58. */
  59. function requestWithAuth(url, options, token) {
  60. var authToken = token != null ? token : (window.WELFARE_TOKEN || '');
  61. var headers = Object.assign({}, options && options.headers);
  62. if (authToken) {
  63. headers.Authorization = authToken;
  64. }
  65. return request(url, Object.assign({}, options, { headers: headers }));
  66. }
  67. window.BEXApi = {
  68. request: request,
  69. requestWithAuth: requestWithAuth,
  70. isSuccessCode: isSuccessCode,
  71. getErrorMessage: getErrorMessage
  72. };
  73. })();