fetch.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import Vue from 'vue'
  2. import '../static/encry.min.js' //接口加密工具
  3. import hostObj from './apiConfig.js' //打包路径
  4. /**
  5. * @param baseUrl 服务信息(如:/landcrm)
  6. * @param url 服务器接口地址,以'/'开头
  7. * @param method HTTP请求方法(GET/POST)
  8. * @param reference 服务地址后的传参,数组形式
  9. * @param data 请求的参数
  10. * @param dataType 请求参数的传参类型(FORMDATA/JSON/XML)
  11. * @param mFetch 接口是否是fetch请求(true/false)
  12. */
  13. export default async (baseUrl = '', url = '', method = 'GET', reference = [], data = {}, dataType = 'FORMDATA', mFetch = true) => {
  14. if (process.env.NODE_ENV == 'production') {
  15. // url = hostObj[baseUrl] + url;
  16. if (baseUrl) {
  17. // baseUrl = hostObj[baseUrl];
  18. baseUrl = process.env.URL + baseUrl;
  19. }
  20. }
  21. url = baseUrl + url;
  22. if (reference && reference.length > 0) {
  23. url += "/" + reference.join("/");
  24. }
  25. method = method.toUpperCase();
  26. //格式化data参数
  27. if (data && typeof data == "object") {
  28. data = JSON.parse(JSON.stringify(data));
  29. }
  30. if (method == 'GET') {
  31. let dataStr = ''; //数据拼接字符串
  32. Object.keys(data).forEach(key => {
  33. if (typeof (data[key]) == "undefined") {
  34. data[key] = "";
  35. }
  36. dataStr += key + '=' + encodeURIComponent(data[key]) + '&';
  37. })
  38. if (dataStr !== '') {
  39. dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
  40. url = url + '?' + dataStr + '&_t=' + new Date().getTime();
  41. } else {
  42. url = url + '?_t=' + new Date().getTime();
  43. }
  44. }
  45. if (window.fetch && mFetch) {
  46. var header_content = {};
  47. if (dataType && dataType === "XML") {
  48. header_content = {
  49. 'Accept': 'application/xml',
  50. 'Content-Type': 'application/x-www-form-urlencoded'
  51. };
  52. } else if (dataType && dataType === "FORMDATA") {
  53. header_content = {
  54. 'Accept': 'application/json',
  55. 'Content-Type': 'application/x-www-form-urlencoded'
  56. };
  57. } else if (dataType && dataType === "JSON") {
  58. header_content = {
  59. 'Accept': 'application/json',
  60. 'Content-Type': 'application/json'
  61. };
  62. }
  63. header_content.platform = 'web';
  64. header_content.sign = key_gen.encode(key_gen.handlerData(method == 'GET' ? url.substring(url.indexOf("?") + 1) : data));
  65. if (localStorage.token && localStorage.token != "") {
  66. header_content.token = localStorage.token;
  67. }
  68. if (localStorage.user_id && localStorage.user_id != "") {
  69. header_content.userId = localStorage.user_id;
  70. }
  71. let requestConfig = {
  72. credentials: 'include',
  73. method: method,
  74. headers: header_content,
  75. mode: "cors",
  76. cache: "force-cache"
  77. }
  78. if (method == 'POST') {
  79. if (dataType === "FORMDATA") {
  80. Object.defineProperty(requestConfig, 'body', {
  81. value: initData(data)
  82. })
  83. } else if (dataType === "JSON") {
  84. Object.defineProperty(requestConfig, 'body', {
  85. value: JSON.stringify(data)
  86. })
  87. }
  88. }
  89. try {
  90. const response = await fetch(url, requestConfig);
  91. if (response.headers.get("token_code") == -2 || response.headers.get("token_code") == -1) {
  92. Vue.prototype.$Message.config({
  93. top: 80,
  94. duration: 3
  95. });
  96. Vue.prototype.$Message.info("当前账号已过期,请重新登录!");
  97. Vue.prototype.$Message = function (str) {
  98. return;
  99. }
  100. setTimeout(function () {
  101. localStorage.clear();
  102. location.reload();
  103. return "";
  104. }, 3000);
  105. } else {
  106. if (dataType && dataType === "XML") {
  107. const responseJson = await response.text();
  108. return responseJson
  109. } else {
  110. const responseJson = await response.json();
  111. return responseJson
  112. }
  113. }
  114. } catch (error) {
  115. Vue.prototype.$Spin.hide();
  116. const responseJson = {
  117. errCode: 500,
  118. msg: "系统异常"
  119. };
  120. return responseJson;
  121. // throw new Error(error)
  122. }
  123. } else {
  124. return new Promise((resolve, reject) => {
  125. let requestObj;
  126. if (window.XMLHttpRequest) {
  127. requestObj = new XMLHttpRequest();
  128. } else {
  129. requestObj = new ActiveXObject;
  130. }
  131. let sendData = '';
  132. if (method == 'POST') {
  133. if (dataType === "FORMDATA") {
  134. sendData = initData(data)
  135. } else if (dataType === "JSON") {
  136. sendData = JSON.stringify(data)
  137. }
  138. }
  139. requestObj.open(method, url, true);
  140. if (dataType && dataType === "XML") {
  141. requestObj.setRequestHeader("Accept", "application/xml");
  142. requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  143. } else if (dataType && dataType === "FORMDATA") {
  144. requestObj.setRequestHeader("Accept", "application/json");
  145. requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  146. } else if (dataType && dataType === "JSON") {
  147. requestObj.setRequestHeader("Accept", "application/json");
  148. requestObj.setRequestHeader("Content-type", "application/json");
  149. }
  150. requestObj.setRequestHeader("platform", 'web');
  151. requestObj.setRequestHeader("sign", key_gen.encode(key_gen.handlerData(method == 'GET' ? url.substring(url.indexOf("?") + 1) : data)));
  152. requestObj.setRequestHeader("token", localStorage.token || '');
  153. requestObj.setRequestHeader("userId", localStorage.user_id || '');
  154. requestObj.send(sendData);
  155. requestObj.onreadystatechange = () => {
  156. if (requestObj.readyState == 4) {
  157. if (requestObj.status == 200) {
  158. let obj = requestObj.response || requestObj.responseT
  159. if (typeof obj !== 'object' && obj.indexOf("<?xml") == -1) {
  160. if (obj.indexOf("<p>") === -1) {
  161. obj = JSON.parse(obj);
  162. } else {
  163. obj = String(obj);
  164. }
  165. }
  166. resolve(obj)
  167. }
  168. }
  169. }
  170. })
  171. }
  172. }
  173. function initData(params) {
  174. var URLSearchParams = require('url-search-params');
  175. //360浏览器不支持URLSearchParams
  176. if (typeof URLSearchParams === "function") {
  177. var formMap = new URLSearchParams();
  178. for (var key in params) {
  179. if (typeof (params[key]) == "undefined") {
  180. params[key] = '';
  181. }
  182. formMap.append(key, params[key]);
  183. }
  184. return formMap;
  185. } else {
  186. return params;
  187. }
  188. }