http.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. layui.define(['jquery', 'layer'], function (exports) {
  2. "use strict";
  3. var $ = layui.jquery;
  4. var layer = layui.layer;
  5. var http = {};
  6. http.ajax = function (userOptions) {
  7. userOptions = userOptions || {};
  8. var options = $.extend(true, {}, http.ajax.defaultOpts, userOptions);
  9. var oldBeforeSendOption = options.beforeSend;
  10. options.beforeSend = function (xhr) {
  11. if (oldBeforeSendOption) {
  12. oldBeforeSendOption(xhr);
  13. }
  14. xhr.setRequestHeader("Pragma", "no-cache");
  15. xhr.setRequestHeader("Cache-Control", "no-cache");
  16. xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT");
  17. };
  18. options.success = undefined;
  19. options.error = undefined;
  20. return $.Deferred(function ($dfd) {
  21. $.ajax(options)
  22. .done(function (data, textStatus, jqXHR) {
  23. $dfd.resolve(data);
  24. userOptions.success && userOptions.success(data);
  25. })
  26. .fail(function (jqXHR) {
  27. http.ajax.handleErrorResponse(jqXHR, userOptions, $dfd);
  28. });
  29. });
  30. }
  31. $.extend(http.ajax, {
  32. defaultOpts: {
  33. dataType: 'json',
  34. type: 'POST',
  35. contentType: 'application/json',
  36. headers: {
  37. 'X-Requested-With': 'XMLHttpRequest'
  38. }
  39. },
  40. defaultError: {
  41. message: 'An error has occurred!',
  42. details: 'Error detail not sent by server.'
  43. },
  44. defaultError401: {
  45. message: 'You are not authenticated!',
  46. details: 'You should be authenticated (sign in) in order to perform this operation.'
  47. },
  48. defaultError403: {
  49. message: 'You are not authorized!',
  50. details: 'You are not allowed to perform this operation.'
  51. },
  52. defaultError404: {
  53. message: 'Resource not found!',
  54. details: 'The resource requested could not found on the server.'
  55. },
  56. logError: function (error) {
  57. console.log(error);
  58. },
  59. showError: function (error) {
  60. if (error.details) {
  61. return layer.alert(error.details, {
  62. title: error.message,
  63. icon: 2,
  64. closeBtn: 0
  65. });
  66. } else {
  67. return layer.alert(http.ajax.defaultError.details, {
  68. title: error.message || http.ajax.defaultError.message,
  69. icon: 2,
  70. closeBtn: 0
  71. });
  72. }
  73. },
  74. showErrorAndRedirectUrl: function (error, targetUrl) {
  75. if (error.details) {
  76. return layer.alert(error.details, {
  77. title: error.message,
  78. icon: 2,
  79. closeBtn: 0,
  80. end: http.ajax.handleTargetUrl(targetUrl)
  81. });
  82. } else {
  83. return layer.alert(http.ajax.defaultError.details, {
  84. title: error.message || http.ajax.defaultError.message,
  85. icon: 2,
  86. closeBtn: 0,
  87. end: http.ajax.handleTargetUrl(targetUrl)
  88. });
  89. }
  90. },
  91. handleTargetUrl: function (targetUrl) {
  92. if (!targetUrl) {
  93. location.href = http.appPath;
  94. } else {
  95. location.href = targetUrl;
  96. }
  97. },
  98. handleErrorResponse: function (jqXHR, userOptions, $dfd) {
  99. if (userOptions.customHandleError !== false) {
  100. switch (jqXHR.status) {
  101. case 401:
  102. http.ajax.showErrorAndRedirectUrl(http.ajax.defaultError401, http.appPath);
  103. break;
  104. case 403:
  105. http.ajax.showError(http.ajax.defaultError403);
  106. break;
  107. case 404:
  108. http.ajax.showError(http.ajax.defaultError404);
  109. break;
  110. default:
  111. http.ajax.showError(http.ajax.defaultError);
  112. break;
  113. }
  114. }
  115. $dfd.reject.apply(this, arguments);
  116. userOptions.error && userOptions.error.apply(this, arguments);
  117. },
  118. ajaxSendHandler: function (event, request, settings) {
  119. var token = http.ajax.getToken();
  120. if (!token) {
  121. return;
  122. }
  123. if (!settings.headers || settings.headers[http.ajax.tokenHeaderName] === undefined) {
  124. request.setRequestHeader(http.ajax.tokenHeaderName, token);
  125. }
  126. },
  127. getToken: function () {
  128. return http.ajax.getCookieValue(http.ajax.tokenCookieName);
  129. },
  130. tokenCookieName: 'XSRF-TOKEN',
  131. tokenHeaderName: 'X-XSRF-TOKEN',
  132. getCookieValue: function (key) {
  133. var equalities = document.cookie.split('; ');
  134. for (var i = 0; i < equalities.length; i++) {
  135. if (!equalities[i]) {
  136. continue;
  137. }
  138. var splitted = equalities[i].split('=');
  139. if (splitted.length != 2) {
  140. continue;
  141. }
  142. if (decodeURIComponent(splitted[0]) === key) {
  143. return decodeURIComponent(splitted[1] || '');
  144. }
  145. }
  146. return null;
  147. }
  148. });
  149. $(document).ajaxSend(function (event, request, settings) {
  150. return http.ajax.ajaxSendHandler(event, request, settings);
  151. });
  152. exports('http', http);
  153. });