Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

request.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. const {
  2. configObj, isNeedEncry
  3. } = require('../config.js');
  4. const {
  5. encryption,
  6. sm4Decrypt
  7. } = require('../new-utils/encryption.js');
  8. /**
  9. * 网络请求工具类
  10. * 封装微信小程序的网络请求,支持加密和签名
  11. */
  12. class NetworkRequest {
  13. constructor() {
  14. this.baseUrl = configObj.reqEtcSignUrl;
  15. this.timeout = 10000; // 默认超时时间10秒
  16. }
  17. /**
  18. * 发送POST请求
  19. * @param {string} ifCode - 接口编码
  20. * @param {Object} data - 请求数据
  21. * @param {Object} options - 请求选项
  22. * @returns {Promise} 返回Promise对象
  23. */
  24. post(ifCode, data = {}, options = {}) {
  25. return new Promise((resolve, reject) => {
  26. try {
  27. // 使用加密工具对数据进行加密和签名
  28. const encryptedData = encryption(ifCode, data);
  29. const requestOptions = {
  30. url: this.baseUrl,
  31. method: 'POST',
  32. data: encryptedData,
  33. header: {
  34. 'Content-Type': 'application/json',
  35. ...options.header
  36. },
  37. timeout: options.timeout || this.timeout,
  38. success: (res) => {
  39. console.log(res)
  40. this.handleResponse(res, resolve, reject);
  41. },
  42. fail: (err) => {
  43. this.handleError(err, resolve, );
  44. }
  45. };
  46. wx.request(requestOptions);
  47. } catch (error) {
  48. console.log(error)
  49. reject({
  50. code: -1,
  51. message: '请求参数处理失败',
  52. error: error
  53. });
  54. }
  55. });
  56. }
  57. /**
  58. * 发送GET请求
  59. * @param {string} ifCode - 接口编码
  60. * @param {Object} data - 请求参数
  61. * @param {Object} options - 请求选项
  62. * @returns {Promise} 返回Promise对象
  63. */
  64. get(ifCode, data = {}, options = {}) {
  65. return new Promise((resolve, reject) => {
  66. try {
  67. // 将参数拼接到URL中
  68. const queryString = this.buildQueryString(data);
  69. const url = `${this.baseUrl}?ifCode=${ifCode}&${queryString}`;
  70. const requestOptions = {
  71. url: url,
  72. method: 'GET',
  73. header: {
  74. 'Content-Type': 'application/json',
  75. ...options.header
  76. },
  77. timeout: options.timeout || this.timeout,
  78. success: (res) => {
  79. this.handleResponse(res, resolve, reject);
  80. },
  81. fail: (err) => {
  82. this.handleError(err, resolve);
  83. }
  84. };
  85. wx.request(requestOptions);
  86. } catch (error) {
  87. resolve({
  88. code: -1,
  89. message: '请求参数处理失败',
  90. error: error
  91. });
  92. }
  93. });
  94. }
  95. /**
  96. * 处理响应结果
  97. * @param {Object} res - 响应对象
  98. * @param {Function} resolve - 成功回调
  99. * @param {Function} reject - 失败回调
  100. */
  101. handleResponse(response, resolve, reject) {
  102. const res = response.data
  103. const msg = res.errorMsg;
  104. const code = res.statusCode
  105. let decrypting = res.bizContent || ""
  106. if (code !== 0) {
  107. resolve({
  108. code: code || -1,
  109. message: msg || '业务处理失败',
  110. data: decrypting
  111. });
  112. } else {
  113. if (res.bizContent) {
  114. if (isNeedEncry()) {
  115. decrypting = sm4Decrypt(res.bizContent);
  116. } else {
  117. decrypting = JSON.parse(res.bizContent);
  118. }
  119. }
  120. console.log("返回数据", decrypting)
  121. if (decrypting.errcode != 0 && decrypting.errcode) {
  122. resolve({
  123. code: -1,
  124. message: decrypting.errmsg,
  125. data: decrypting
  126. })
  127. } else {
  128. resolve({
  129. code: 0,
  130. message: decrypting.errmsg,
  131. data: decrypting
  132. })
  133. }
  134. }
  135. }
  136. /**
  137. * 处理请求错误
  138. * @param {Object} err - 错误对象
  139. * @param {Function} reject - 失败回调
  140. */
  141. handleError(err, resolve) {
  142. let errorMessage = '网络请求失败';
  143. if (err.errMsg) {
  144. if (err.errMsg.includes('timeout')) {
  145. errorMessage = '请求超时,请检查网络连接';
  146. } else if (err.errMsg.includes('fail')) {
  147. errorMessage = '网络连接失败,请检查网络设置';
  148. }
  149. }
  150. resolve({
  151. code: -1,
  152. message: errorMessage,
  153. data: err
  154. });
  155. }
  156. /**
  157. * 构建查询字符串
  158. * @param {Object} params - 参数对象
  159. * @returns {string} 查询字符串
  160. */
  161. buildQueryString(params) {
  162. const queryArray = [];
  163. for (const key in params) {
  164. if (params.hasOwnProperty(key) && params[key] !== undefined && params[key] !== null) {
  165. queryArray.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`);
  166. }
  167. }
  168. return queryArray.join('&');
  169. }
  170. /**
  171. * 设置请求超时时间
  172. * @param {number} timeout - 超时时间(毫秒)
  173. */
  174. setTimeout(timeout) {
  175. this.timeout = timeout;
  176. }
  177. /**
  178. * 设置基础URL
  179. * @param {string} url - 基础URL
  180. */
  181. setBaseUrl(url) {
  182. this.baseUrl = url;
  183. }
  184. }
  185. // 创建单例实例
  186. const networkRequest = new NetworkRequest();
  187. /**
  188. * 便捷的请求方法
  189. */
  190. const request = {
  191. /**
  192. * POST请求
  193. * @param {string} ifCode - 接口编码
  194. * @param {Object} data - 请求数据
  195. * @param {Object} options - 请求选项
  196. * @returns {Promise} 返回Promise对象
  197. */
  198. post: (ifCode, data, options) => networkRequest.post(ifCode, data, options),
  199. /**
  200. * GET请求
  201. * @param {string} ifCode - 接口编码
  202. * @param {Object} data - 请求参数
  203. * @param {Object} options - 请求选项
  204. * @returns {Promise} 返回Promise对象
  205. */
  206. get: (ifCode, data, options) => networkRequest.get(ifCode, data, options),
  207. /**
  208. * 设置超时时间
  209. * @param {number} timeout - 超时时间(毫秒)
  210. */
  211. setTimeout: (timeout) => networkRequest.setTimeout(timeout),
  212. /**
  213. * 设置基础URL
  214. * @param {string} url - 基础URL
  215. */
  216. setBaseUrl: (url) => networkRequest.setBaseUrl(url)
  217. };
  218. // CommonJS 导出
  219. module.exports = {
  220. NetworkRequest,
  221. request
  222. };
  223. module.exports.default = NetworkRequest;