httpClient.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { relogin } from "../core/auth/server/server-auth";
  2. import { getCommonParams } from "../store/models/params.model";
  3. import UserInfoModel from "../store/models/user.model";
  4. import { decryptData, generateSign } from "./encrypted";
  5. interface ApiOptions {
  6. url: string;
  7. data?: any;
  8. method?: 'GET' | 'POST'
  9. }
  10. interface ApiResponse {
  11. code: number;
  12. data: any;
  13. message: string;
  14. }
  15. const api = async <T>({ url, data, method = 'GET' }: ApiOptions): Promise<T> => {
  16. try {
  17. return await request<T>({ url, data, method })
  18. } catch (error) {
  19. // 如果是401错误,尝试重新登录
  20. if (error.code === 401) {
  21. console.log("登录过期,尝试重新登录...");
  22. try {
  23. // 调用重新登录方法
  24. await relogin();
  25. console.log("重新登录成功,重新发起请求...");
  26. // 重新获取登录信息
  27. const newLoginInfo = UserInfoModel.getInstance().get();
  28. // 重新发起请求
  29. return new Promise((resolve, reject) => {
  30. wx.request({
  31. url: url,
  32. header: {
  33. "Content-Type": "application/x-www-form-urlencoded",
  34. Authorization: `Bearer ${newLoginInfo.token}`,
  35. },
  36. method: method,
  37. data,
  38. success: (res: any) => {
  39. if (res.statusCode === 200) {
  40. const responseData = res.data as ApiResponse;
  41. if (responseData.code === 200) {
  42. // 解密响应数据
  43. responseData.data = decryptData(responseData.data);
  44. resolve(responseData.data);
  45. } else {
  46. reject({
  47. code: responseData.code,
  48. msg: responseData.message,
  49. });
  50. }
  51. } else {
  52. reject({
  53. code: -1,
  54. msg: `网络请求失败 ${res.statusCode}`,
  55. });
  56. }
  57. },
  58. fail: (error) => {
  59. reject({
  60. code: -1,
  61. msg: error.errMsg,
  62. });
  63. },
  64. });
  65. });
  66. } catch (loginError) {
  67. console.error("重新登录失败:", loginError);
  68. // 重新登录失败,返回原始错误
  69. throw error;
  70. }
  71. } else {
  72. // 其他错误直接抛出
  73. throw error;
  74. }
  75. }
  76. }
  77. const request = async <T>({ url, data, method = 'GET' }: ApiOptions): Promise<T> => {
  78. return new Promise<T>((resolve, reject) => {
  79. const token = UserInfoModel.getInstance().getToken();
  80. const commonParams = getCommonParams()
  81. let params = {
  82. ...commonParams,
  83. ...data
  84. }
  85. params = generateSign(params)
  86. // signParams.sign = sign
  87. wx.request({
  88. url,
  89. data: params,
  90. method,
  91. header: {
  92. "Content-Type": "application/x-www-form-urlencoded",
  93. Authorization: `Bearer ${token}`
  94. },
  95. success: (res: any) => {
  96. if (res.statusCode === 200) {
  97. const responseData = res.data as ApiResponse;
  98. if (responseData.code === 200) {
  99. responseData.data = decryptData(responseData.data);
  100. resolve(responseData.data);
  101. } else if (responseData.code === 401) {
  102. reject({
  103. code: 401,
  104. msg: responseData.message,
  105. });
  106. } else {
  107. // wx.showModal({
  108. // title: "网络错误",
  109. // icon:"none",
  110. // showCancel:false,
  111. // content: `${url}:${responseData.message}`,
  112. // })
  113. // reject({
  114. // code: responseData.code,
  115. // msg: responseData.message,
  116. // });
  117. }
  118. return responseData;
  119. } else {
  120. reject({
  121. code: -1,
  122. msg: `network error ${res.message}`,
  123. });
  124. }
  125. },
  126. fail: (error) => {
  127. reject({
  128. code: -1,
  129. msg: `network error ${error.errMsg}`,
  130. });
  131. },
  132. });
  133. })
  134. }
  135. const get = <T>(url: string, data?: any): Promise<T> => {
  136. return api<T>({ url: `${import.meta.env.SDK_API_BASE}${url}`, data, method: 'GET' })
  137. }
  138. const post = <T>(url: string, data?: any): Promise<T> => {
  139. return api<T>({ url: `${import.meta.env.SDK_API_BASE}${url}`, data, method: 'POST' })
  140. }
  141. export default {
  142. get,
  143. post
  144. }