axios.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. // 引入axios
  2. import BASE from '@tools/base'
  3. import store from '@store/index'
  4. import axios from 'axios'
  5. import { Message } from 'element-ui';
  6. /**
  7. * 通用请求函数
  8. * @param {Object} options 详细配置项,使用方法与所有配置项说明如下:
  9. this.API.requestData({
  10. isMust: true, // 请求是否携带 token ,默认为 true ,可缺省
  11. showLoading: false, // 请求是否显示加载中遮罩层,默认 false ,可缺省
  12. method: "GET", // 请求方式,默认为 GET ,可缺省
  13. baseURL: "http://192.168.10.23:8082/", // 请求服务器地址 + 端口,可缺省
  14. subUrl: "api/repassword", // 请求接口地址,必传项
  15. timeout: 3000, // 请求超时时间,默认 3s ,可缺省
  16. data: { name: "admin", pasword: "123456" }, // 请求所携带参数,默认为空,可缺省
  17. success (res) {
  18. // 请求成功的回调
  19. },
  20. fail (error) {
  21. // 请求失败的回调
  22. }
  23. });
  24. */
  25. export function requestData (options) {
  26. return new Promise((resolve, reject) => {
  27. if (options.showLoading) {
  28. store.state.loading = true;
  29. }
  30. // 包装请求头
  31. let headers = {
  32. 'Content-Type': 'application/x-www-form-urlencoded',
  33. };
  34. // 请求是否携带 token
  35. const isMust = (options.isMust == true || options.isMust == false) ? options.isMust : true;
  36. headers.authToken = localStorage.getItem('authToken');
  37. // 创建请求实例
  38. const XHRReq = axios.create({
  39. headers,
  40. baseURL: options.baseURL || process.env.VUE_APP_API_URL || '/api/',
  41. timeout: options.timeout || 3000,
  42. });
  43. // 请求拦截器
  44. XHRReq.interceptors.request.use((config) => {
  45. return config;
  46. }, (err) => {
  47. return Promise.reject(err);
  48. });
  49. // 统一格式包装请求参数
  50. let params = new URLSearchParams();
  51. for (let key in (options.data || {})) {
  52. params.append(key, options.data[key]);
  53. }
  54. // 发起请求
  55. XHRReq({
  56. url: options.subUrl,
  57. method: options.method || 'GET',
  58. params,
  59. }).then(response => {
  60. if (options.showLoading) {
  61. store.state.loading = false;
  62. }
  63. if (response.code === 501) { // 用户类请求错误code (账号密码错误、用户锁定、token过期等)
  64. localStorage.removeItem('authToken');
  65. Message.error(response.data.msg);
  66. setTimeout(() => {
  67. window.location.reload();
  68. // window.__STATICVUE__.$router.replace('/login');
  69. }, 1000);
  70. } else if (response.code === 200) { // 请求成功 code
  71. options.success && options.success(response.data);
  72. resolve(response);
  73. } else { // 其他code
  74. Message.error((response.data && response.data.msg) || ("请求出错[" + response.data.code + "]"));
  75. }
  76. }).catch(error => {
  77. if (options.showLoading) {
  78. store.state.loading = false;
  79. }
  80. options.fail && options.fail(error);
  81. reject(error);
  82. });
  83. });
  84. }
  85. // 创建axios实例
  86. const httpService = axios.create({
  87. withCredentials: true, // 允许携带cookie
  88. baseURL: process.env.VUE_APP_API_URL || '/api/',
  89. timeout: 23000, // 请求超时时间 - 3s
  90. // transformRequest: [
  91. // // `transformRequest` 允许在向服务器发送前,修改请求数据
  92. // // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  93. // // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  94. // data => {
  95. // var fData = new FormData();
  96. // for(let key in data){
  97. // fData.append(key, data[key]);
  98. // }
  99. // return fData
  100. // }
  101. // ],
  102. //修改请求头信息
  103. headers: {
  104. 'Content-Type': 'application/x-www-form-urlencoded',
  105. 'authToken': localStorage.getItem('authToken')
  106. // 'Access-Control-Allow-Origin':'*'
  107. // 'Content-Type': 'multipart/form-data'
  108. // 'Content-Type': 'application/json;charset=UTF-8'
  109. },
  110. });
  111. const httpService_L = axios.create({
  112. withCredentials: true, // 允许携带cookie
  113. baseURL: process.env.VUE_APP_API_URL || '/api/',
  114. timeout: 210000, // 请求超时时间 - 3s
  115. headers: {
  116. 'Content-Type': 'application/x-www-form-urlencoded',
  117. 'authToken': localStorage.getItem('authToken'),
  118. },
  119. });
  120. // httpService.defaults.withCredentials = true; // 表示跨域请求时是否需要使用凭证
  121. httpService_L.interceptors.request.use(
  122. config => {
  123. if (localStorage.getItem('authToken')) {
  124. config.headers.authToken = localStorage.getItem('authToken');
  125. }
  126. return config;
  127. },
  128. err => {
  129. return Promise.reject(err);
  130. }
  131. );
  132. // http request 拦截器
  133. httpService.interceptors.request.use(
  134. config => {
  135. if (localStorage.getItem('authToken')) {
  136. config.headers.authToken = localStorage.getItem('authToken');
  137. }
  138. return config;
  139. },
  140. err => {
  141. return Promise.reject(err);
  142. }
  143. );
  144. //长时间相应拦截器
  145. httpService_L.interceptors.response.use(
  146. response => {
  147. const {
  148. data
  149. } = response;
  150. if (data.code === 200) {
  151. }
  152. else {
  153. // let rqData = JSON.parse(response.config.data); // 请求数据
  154. // console.error(BASE.getNowTime(), rqData.interfaceid+":"+data.message)
  155. Message.warning(data.message);
  156. store.commit('loadingStore', false); // 全局的数据 加载中.... - 开关
  157. store.commit('openSubmitDDTag', false); // 防抖动 - 开关
  158. }
  159. return data; // 响应正确的数据
  160. }, error => {
  161. // 响应错误数据(错误情况分无token信息,错误码)
  162. const {
  163. response
  164. } = error;
  165. if (response) {
  166. switch (error.response.status) {
  167. case 400:
  168. error.message = '错误请求';
  169. break;
  170. case 401:
  171. error.message = '未授权,请重新登录';
  172. break;
  173. case 403:
  174. error.message = '拒绝访问';
  175. break;
  176. case 404:
  177. error.message = '请求错误,未找到该资源';
  178. break;
  179. case 405:
  180. error.message = '请求方法未允许';
  181. break;
  182. case 408:
  183. error.message = '请求超时';
  184. break;
  185. case 500:
  186. error.message = '服务器端出错';
  187. break;
  188. case 501:
  189. error.message = '网络未实现';
  190. break;
  191. case 502:
  192. error.message = '网络错误';
  193. break;
  194. case 503:
  195. error.message = '服务不可用';
  196. break;
  197. case 504:
  198. error.message = '网络超时';
  199. break;
  200. case 505:
  201. error.message = 'http版本不支持该请求';
  202. break;
  203. default:
  204. error.message = `未知错误${error.response.status}`;
  205. }
  206. } else {
  207. error.message = "请求超时";
  208. }
  209. store.commit('loadingStore', false); // 全局的数据 加载中... - 开关
  210. store.commit('openSubmitDDTag', false); // 防抖动 - 开关
  211. console.error(BASE.getBzDate(new Date().getTime(), 0, "datetime"), error.message)
  212. Message.error(error.message + ",请稍候重试!");
  213. }
  214. );
  215. // respone拦截器
  216. httpService.interceptors.response.use(
  217. response => {
  218. const {
  219. data
  220. } = response;
  221. if (data.code === 200) {
  222. }
  223. else {
  224. // let rqData = JSON.parse(response.config.data); // 请求数据
  225. // console.error(BASE.getNowTime(), rqData.interfaceid+":"+data.message)
  226. Message.warning(data.message);
  227. store.commit('loadingStore', false); // 全局的数据 加载中.... - 开关
  228. store.commit('openSubmitDDTag', false); // 防抖动 - 开关
  229. }
  230. return data; // 响应正确的数据
  231. }, error => {
  232. // 响应错误数据(错误情况分无token信息,错误码)
  233. const {
  234. response
  235. } = error;
  236. if (response) {
  237. switch (error.response.status) {
  238. case 400:
  239. error.message = '错误请求';
  240. break;
  241. case 401:
  242. error.message = '未授权,请重新登录';
  243. break;
  244. case 403:
  245. error.message = '拒绝访问';
  246. break;
  247. case 404:
  248. error.message = '请求错误,未找到该资源';
  249. break;
  250. case 405:
  251. error.message = '请求方法未允许';
  252. break;
  253. case 408:
  254. error.message = '请求超时';
  255. break;
  256. case 500:
  257. error.message = '服务器端出错';
  258. break;
  259. case 501:
  260. error.message = '网络未实现';
  261. break;
  262. case 502:
  263. error.message = '网络错误';
  264. break;
  265. case 503:
  266. error.message = '服务不可用';
  267. break;
  268. case 504:
  269. error.message = '网络超时';
  270. break;
  271. case 505:
  272. error.message = 'http版本不支持该请求';
  273. break;
  274. default:
  275. error.message = `未知错误${error.response.status}`;
  276. }
  277. } else {
  278. error.message = "请求超时";
  279. }
  280. store.commit('loadingStore', false); // 全局的数据 加载中... - 开关
  281. store.commit('openSubmitDDTag', false); // 防抖动 - 开关
  282. console.error(BASE.getBzDate(new Date().getTime(), 0, "datetime"), error.message)
  283. Message.error(error.message + ",请稍候重试!");
  284. }
  285. );
  286. /*
  287. * get请求
  288. * url: 接口地址
  289. * params: 参数,格式如下
  290. * */
  291. export function get (url, params = {}) {
  292. return new Promise((resolve, reject) => {
  293. httpService({
  294. url: url,
  295. method: 'get',
  296. params: params,
  297. }).then(response => {
  298. resolve(response);
  299. }).catch(error => {
  300. reject(error);
  301. });
  302. });
  303. }
  304. /*
  305. * post请求
  306. * url: 接口地址
  307. * params: 参数,格式如下
  308. * */
  309. export function post (url, params = {}) {
  310. return new Promise((resolve, reject) => {
  311. httpService({
  312. url: url,
  313. method: 'post',
  314. data: params,
  315. }).then(response => {
  316. resolve(response);
  317. }).catch(error => {
  318. reject(error);
  319. });
  320. });
  321. }
  322. /*
  323. * get请求 长时间
  324. * url: 接口地址
  325. * params: 参数,格式如下
  326. * */
  327. export function get_L (url, params = {}) {
  328. return new Promise((resolve, reject) => {
  329. httpService_L({
  330. url: url,
  331. method: 'get',
  332. params: params,
  333. }).then(response => {
  334. resolve(response);
  335. }).catch(error => {
  336. reject(error);
  337. });
  338. });
  339. }
  340. /*
  341. * post请求 长时间
  342. * url: 接口地址
  343. * params: 参数,格式如下
  344. * */
  345. export function post_L (url, params = {}) {
  346. return new Promise((resolve, reject) => {
  347. httpService_L({
  348. url: url,
  349. method: 'post',
  350. data: params,
  351. }).then(response => {
  352. resolve(response);
  353. }).catch(error => {
  354. reject(error);
  355. });
  356. });
  357. }
  358. /*
  359. * post请求 - 超过5s使用的方法
  360. * url: 接口地址
  361. * params: 参数,格式如下
  362. * */
  363. export function postL (url, params = {}) {
  364. return new Promise((resolve, reject) => {
  365. axios.create({
  366. withCredentials: true, // 允许携带cookie
  367. baseURL: process.env.VUE_APP_API_URL || '/api/',
  368. timeout: 210000, // 请求超时时间 - 60s
  369. //修改请求头信息
  370. headers: {
  371. 'Content-Type': 'application/x-www-form-urlencoded',
  372. 'authToken': localStorage.getItem('authToken'),
  373. },
  374. })({
  375. url: url,
  376. method: 'post',
  377. data: params,
  378. }).then(response => {
  379. resolve(response);
  380. }).catch(error => {
  381. reject(error);
  382. });
  383. });
  384. }
  385. export default {
  386. get,
  387. get_L,
  388. post,
  389. post_L,
  390. postL,
  391. requestData
  392. }