request.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import {
  2. mergeConfig,
  3. dispatchRequest,
  4. jsonpRequest
  5. } from "./utils"
  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 || 6000;
  14. // 服务器上传图片默认url
  15. this.defaultUploadUrl = options.defaultUploadUrl || "";
  16. // 默认请求头
  17. this.header = options.header || {};
  18. // 默认配置
  19. this.config = options.config || {
  20. isPrompt: true,
  21. load: true,
  22. isFactory: true,
  23. resend: 0
  24. };
  25. }
  26. // arraybuffer请求
  27. arraybuffer(url = '', data = {}, options = {}) {
  28. return this.request({
  29. method: "GET",
  30. data: data,
  31. url: url,
  32. ...options,
  33. responseType: 'arraybuffer',
  34. header: {
  35. 'content-type': 'application/x-www-form-urlencoded',
  36. 'Accept-Encoding': 'gzip, deflate',
  37. 'Accept': 'application/json, text/plain, */*'
  38. },
  39. });
  40. }
  41. // form请求
  42. form(url = '', data = {}, options = {}) {
  43. return this.request({
  44. method: "POST",
  45. data: data,
  46. header: {
  47. 'content-type': 'application/x-www-form-urlencoded'
  48. },
  49. url: url,
  50. ...options,
  51. });
  52. }
  53. // post请求
  54. post(url = '', data = {}, options = {}) {
  55. return this.request({
  56. method: "POST",
  57. data: data,
  58. url: url,
  59. ...options
  60. });
  61. }
  62. // get请求
  63. get(url = '', data = {}, options = {}) {
  64. return this.request({
  65. method: "GET",
  66. data: data,
  67. url: url,
  68. ...options
  69. });
  70. }
  71. // put请求
  72. put(url = '', data = {}, options = {}) {
  73. return this.request({
  74. method: "PUT",
  75. data: data,
  76. url: url,
  77. ...options
  78. });
  79. }
  80. // delete请求
  81. delete(url = '', data = {}, options = {}) {
  82. return this.request({
  83. method: "DELETE",
  84. data: data,
  85. url: url,
  86. ...options
  87. });
  88. }
  89. // jsonp请求(只限于H5使用)
  90. jsonp(url = '', data = {}, options = {}) {
  91. return this.request({
  92. method: "JSONP",
  93. data: data,
  94. url: url,
  95. ...options
  96. });
  97. }
  98. // 接口请求方法
  99. async request(data) {
  100. // 请求数据
  101. let requestInfo,
  102. // 是否运行过请求开始钩子
  103. runRequestStart = false;
  104. try {
  105. if (!data.url) {
  106. throw {
  107. errMsg: "【request】缺失数据url",
  108. statusCode: 0
  109. }
  110. }
  111. // 数据合并
  112. requestInfo = mergeConfig(this, data);
  113. // 代表之前运行到这里
  114. runRequestStart = true;
  115. // 请求前回调
  116. if (this.requestStart) {
  117. let requestStart = this.requestStart(requestInfo);
  118. if (typeof requestStart == "object") {
  119. let changekeys = ["data", "header", "isPrompt", "load", "isFactory"];
  120. changekeys.forEach(key => {
  121. requestInfo[key] = requestStart[key];
  122. });
  123. } else {
  124. throw {
  125. errMsg: "【request】请求开始拦截器未通过",
  126. statusCode: 0,
  127. data: requestInfo.data,
  128. method: requestInfo.method,
  129. header: requestInfo.header,
  130. url: requestInfo.url,
  131. }
  132. }
  133. }
  134. let requestResult = {};
  135. if (requestInfo.method == "JSONP") {
  136. console.log('JSONP类型')
  137. requestResult = await jsonpRequest(requestInfo);
  138. } else {
  139. // console.log('requestInfo', requestInfo)
  140. requestResult = await dispatchRequest(requestInfo);
  141. }
  142. // 是否用外部的数据处理方法
  143. if (requestInfo.isFactory && this.dataFactory) {
  144. // 数据处理
  145. let result = await this.dataFactory({
  146. ...requestInfo,
  147. response: requestResult
  148. });
  149. return Promise.resolve(result);
  150. } else {
  151. return Promise.resolve(requestResult);
  152. }
  153. } catch (err) {
  154. this.requestError && this.requestError(err);
  155. return Promise.reject(err);
  156. } finally {
  157. // 如果请求开始未运行到,请求结束也不运行
  158. if (runRequestStart) {
  159. this.requestEnd && this.requestEnd(requestInfo);
  160. }
  161. }
  162. }
  163. }