request.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import {
  2. mergeConfig,
  3. dispatchRequest,
  4. jsonpRequest
  5. } from "./utils.js";
  6. export default class request {
  7. constructor(options) {
  8. //请求公共地址
  9. this.baseUrl = options.baseUrl || "";
  10. //公共文件上传请求地址
  11. this.fileUrl = options.fileUrl || "";
  12. // 超时时间
  13. this.timeout = options.timeout || 300000;
  14. // 服务器上传图片默认url
  15. this.defaultUploadUrl = options.defaultUploadUrl || "";
  16. // 服务器上传文件名称
  17. this.defaultFileName = options.defaultFileName || "";
  18. //默认请求头
  19. this.header = options.header || {};
  20. //默认配置
  21. this.config = options.config || {
  22. isPrompt: true,
  23. load: true,
  24. isFactory: true,
  25. resend: 0
  26. };
  27. }
  28. //post请求
  29. post(url = '', data = {}, options = {}) {
  30. return this.request({
  31. method: "POST",
  32. data: data,
  33. url: url,
  34. ...options
  35. });
  36. }
  37. //get请求
  38. get(url = '', data = {}, options = {}) {
  39. return this.request({
  40. method: "GET",
  41. data: data,
  42. url: url,
  43. ...options
  44. });
  45. }
  46. //put请求
  47. put(url = '', data = {}, options = {}) {
  48. return this.request({
  49. method: "PUT",
  50. data: data,
  51. url: url,
  52. ...options
  53. });
  54. }
  55. //delete请求
  56. delete(url = '', data = {}, options = {}) {
  57. return this.request({
  58. method: "DELETE",
  59. data: data,
  60. url: url,
  61. ...options
  62. });
  63. }
  64. //jsonp请求(只限于H5使用)
  65. jsonp(url = '', data = {}, options = {}) {
  66. return this.request({
  67. method: "JSONP",
  68. data: data,
  69. url: url,
  70. ...options
  71. });
  72. }
  73. //接口请求方法
  74. async request(data) {
  75. // 请求数据
  76. let requestInfo,
  77. // 是否运行过请求开始钩子
  78. runRequestStart = false;
  79. try {
  80. if (!data.url) {
  81. // throw { errMsg: "【request】缺失数据url", statusCode: 0}
  82. throw {
  83. errMsg: "缺失数据url",
  84. statusCode: 0
  85. }
  86. }
  87. // 数据合并
  88. requestInfo = mergeConfig(this, data);
  89. // 代表之前运行到这里
  90. runRequestStart = true;
  91. //请求前回调
  92. if (this.requestStart) {
  93. let requestStart = this.requestStart(requestInfo);
  94. if (typeof requestStart == "object") {
  95. let changekeys = ["data", "header", "isPrompt", "load", "isFactory"];
  96. changekeys.forEach(key => {
  97. requestInfo[key] = requestStart[key];
  98. });
  99. } else {
  100. throw {
  101. // errMsg: "【request】请求开始拦截器未通过",
  102. errMsg: "请求开始拦截器未通过",
  103. statusCode: 0,
  104. data: requestInfo.data,
  105. method: requestInfo.method,
  106. header: requestInfo.header,
  107. url: requestInfo.url,
  108. }
  109. }
  110. }
  111. let requestResult = {};
  112. if (requestInfo.method == "JSONP") {
  113. requestResult = await jsonpRequest(requestInfo);
  114. } else {
  115. requestResult = await dispatchRequest(requestInfo);
  116. }
  117. //是否用外部的数据处理方法
  118. if (requestInfo.isFactory && this.dataFactory) {
  119. //数据处理
  120. let result = await this.dataFactory({
  121. ...requestInfo,
  122. response: requestResult
  123. });
  124. return Promise.resolve(result);
  125. } else {
  126. return Promise.resolve(requestResult);
  127. }
  128. } catch (err) {
  129. this.requestError && this.requestError(err);
  130. return Promise.reject(err);
  131. } finally {
  132. // 如果请求开始未运行到,请求结束也不运行
  133. if (runRequestStart) {
  134. this.requestEnd && this.requestEnd(requestInfo);
  135. }
  136. }
  137. }
  138. }