http.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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. customHandleError: true
  40. },
  41. defaultError: {
  42. message: 'An error has occurred!',
  43. details: 'Error detail not sent by server.'
  44. },
  45. defaultError401: {
  46. message: 'You are not authenticated!',
  47. details: 'You should be authenticated (sign in) in order to perform this operation.'
  48. },
  49. defaultError403: {
  50. message: 'You are not authorized!',
  51. details: 'You are not allowed to perform this operation.'
  52. },
  53. defaultError404: {
  54. message: 'Resource not found!',
  55. details: 'The resource requested could not found on the server.'
  56. },
  57. logError: function (error) {
  58. console.log(error);
  59. },
  60. showError: function (error) {
  61. if (error.details) {
  62. return layer.alert(error.details, {
  63. title: error.message,
  64. icon: 2,
  65. closeBtn: 0
  66. });
  67. } else {
  68. return layer.alert(http.ajax.defaultError.details, {
  69. title: error.message || http.ajax.defaultError.message,
  70. icon: 2,
  71. closeBtn: 0
  72. });
  73. }
  74. },
  75. showErrorAndRedirectUrl: function (error, targetUrl) {
  76. if (error.details) {
  77. return layer.alert(error.details, {
  78. title: error.message,
  79. icon: 2,
  80. closeBtn: 0,
  81. end: http.ajax.handleTargetUrl(targetUrl)
  82. });
  83. } else {
  84. return layer.alert(http.ajax.defaultError.details, {
  85. title: error.message || http.ajax.defaultError.message,
  86. icon: 2,
  87. closeBtn: 0,
  88. end: http.ajax.handleTargetUrl(targetUrl)
  89. });
  90. }
  91. },
  92. handleTargetUrl: function (targetUrl) {
  93. if (!targetUrl) {
  94. location.href = http.appPath;
  95. } else {
  96. location.href = targetUrl;
  97. }
  98. },
  99. handleErrorResponse: function (jqXHR, userOptions, $dfd) {
  100. if (!userOptions.customHandleError) {
  101. switch (jqXHR.status) {
  102. case 401:
  103. http.ajax.showErrorAndRedirectUrl(http.ajax.defaultError401, http.appPath);
  104. break;
  105. case 403:
  106. http.ajax.showError(http.ajax.defaultError403);
  107. break;
  108. case 404:
  109. http.ajax.showError(http.ajax.defaultError404);
  110. break;
  111. default:
  112. http.ajax.showError(http.ajax.defaultError);
  113. break;
  114. }
  115. }
  116. $dfd.reject.apply(this, arguments);
  117. userOptions.error && userOptions.error.apply(this, arguments);
  118. },
  119. ajaxSendHandler: function (event, request, settings) {
  120. var token = http.ajax.getToken();
  121. if (!token) {
  122. return;
  123. }
  124. if (!settings.headers || settings.headers[http.ajax.tokenHeaderName] === undefined) {
  125. request.setRequestHeader(http.ajax.tokenHeaderName, token);
  126. }
  127. },
  128. getToken: function () {
  129. return http.ajax.getCookieValue(http.ajax.tokenCookieName);
  130. },
  131. tokenCookieName: 'XSRF-TOKEN',
  132. tokenHeaderName: 'X-XSRF-TOKEN',
  133. getCookieValue: function (key) {
  134. var equalities = document.cookie.split('; ');
  135. for (var i = 0; i < equalities.length; i++) {
  136. if (!equalities[i]) {
  137. continue;
  138. }
  139. var splitted = equalities[i].split('=');
  140. if (splitted.length != 2) {
  141. continue;
  142. }
  143. if (decodeURIComponent(splitted[0]) === key) {
  144. return decodeURIComponent(splitted[1] || '');
  145. }
  146. }
  147. return null;
  148. }
  149. });
  150. $(document).ajaxSend(function (event, request, settings) {
  151. return http.ajax.ajaxSendHandler(event, request, settings);
  152. });
  153. exports('http', http);
  154. });