request.js 3.2 KB

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