request.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. // 预发布地址
  2. import { apple } from "../config/config";
  3. let httpTrackLog = "https://hyperion-track-app.mokamrp.com";
  4. let httpServiceURL = "";
  5. let version = __wxConfig.envVersion;
  6. import { https } from "../config/config";
  7. switch (version) {
  8. case "develop":
  9. httpServiceURL = https.dev_apiHttps;
  10. break;
  11. case "trial":
  12. httpServiceURL = https.test_apiHttps;
  13. break;
  14. case "release": //正式版
  15. httpServiceURL = https.apiHttps;
  16. break;
  17. default: //未知,默认调用正式版
  18. httpServiceURL = https.apiHttps;
  19. break;
  20. }
  21. // 添加登录锁和请求队列
  22. let isLoggingIn = false;
  23. let loginPromise = null;
  24. let pendingRequests = [];
  25. // 执行等待队列中的请求
  26. const executePendingRequests = () => {
  27. const requests = [...pendingRequests];
  28. pendingRequests = [];
  29. return Promise.all(requests.map((req) => req()));
  30. };
  31. // 普通POST请求
  32. export const post = (url, body = {}) => {
  33. return new Promise((resolve, reject) => {
  34. wx.request({
  35. url: url,
  36. data: body,
  37. method: "POST",
  38. dataType: "json",
  39. success: (res) => {
  40. if (res.statusCode == 200 && res.data.code == 200) {
  41. resolve(res.data.data);
  42. } else {
  43. reject(res);
  44. }
  45. },
  46. fail: (res) => {
  47. console.log(url, "error--------", res);
  48. reject(res);
  49. },
  50. });
  51. });
  52. };
  53. // 普通Get请求
  54. export const get = (url) => {
  55. return new Promise((resolve, reject) => {
  56. wx.request({
  57. url: url,
  58. method: "GET",
  59. success: (res) => {
  60. if (res.statusCode == 200) {
  61. resolve(res.data);
  62. } else {
  63. reject(res);
  64. }
  65. },
  66. fail: (res) => {
  67. reject(res);
  68. },
  69. });
  70. });
  71. };
  72. /**
  73. * 打点请求
  74. */
  75. export function uploadTrackLog(url, body) {
  76. if (!body) {
  77. body = {};
  78. }
  79. return post(httpTrackLog + url, body);
  80. }
  81. export function bookPlatformPost(url, body) {
  82. if (!body) {
  83. body = {};
  84. }
  85. return post("https://book-platform-api.mokamrp.com" + url, body);
  86. }
  87. export const requestLogin = (data) => {
  88. console.log("开始登录请求,参数:", data);
  89. return new Promise((resolve, reject) => {
  90. // 检查是否已经有token
  91. const existingToken = wx.getStorageSync("accessToken");
  92. if (existingToken) {
  93. console.log("已存在token,跳过登录");
  94. return resolve({ accessToken: existingToken });
  95. }
  96. wx.request({
  97. url: httpServiceURL + "/user/loginWx",
  98. data: data,
  99. method: "POST",
  100. dataType: "json",
  101. header: {},
  102. success: function (res) {
  103. if (res.data.code == 200) {
  104. console.log("登录成功,保存token");
  105. wx.setStorageSync("accessToken", res.data.data.accessToken);
  106. resolve(res.data.data);
  107. } else {
  108. console.log("登录失败,错误信息:", res.data);
  109. wx.showToast({
  110. title: res.data.msg || res.data.error || "登录失败...",
  111. icon: "none",
  112. });
  113. reject(res.data);
  114. }
  115. },
  116. fail: function (res) {
  117. console.log("登录请求失败:", res);
  118. wx.showToast({
  119. title: "登录失败...",
  120. icon: "none",
  121. });
  122. reject(res);
  123. },
  124. });
  125. });
  126. };
  127. export const requestAll = (
  128. requestUrl,
  129. body,
  130. method = "POST",
  131. customHeaders = {},
  132. ) => {
  133. let url = httpServiceURL + requestUrl;
  134. if (method === "GET") {
  135. if (body) {
  136. url += "?";
  137. for (const k in body) {
  138. url += `&${k}=${body[k]}`;
  139. }
  140. }
  141. }
  142. // 封装请求函数
  143. const doRequest = () => {
  144. return new Promise((resolve, reject) => {
  145. const token = wx.getStorageSync("accessToken") || "";
  146. wx.request({
  147. url: url,
  148. data: body,
  149. method: method,
  150. dataType: "json",
  151. header: {
  152. token,
  153. },
  154. success: function (res) {
  155. if (res.data.code == 200) {
  156. if (typeof res.data.data === "number") {
  157. resolve(res.data.data);
  158. } else {
  159. resolve(res.data.data || []);
  160. }
  161. } else if (res.data.code == 20001) {
  162. console.error("令牌过期", url);
  163. reject({ code: 20001, msg: "令牌过期" });
  164. } else {
  165. reject(res.data);
  166. }
  167. },
  168. fail: function (res) {
  169. wx.showToast({
  170. title: "网络出错,请重试...",
  171. icon: "none",
  172. });
  173. reject(res);
  174. },
  175. });
  176. });
  177. };
  178. // 执行请求,如果token过期则重新登录后重试
  179. return doRequest().catch(async (error) => {
  180. if (error.code == 20001) {
  181. // 如果已经在登录中,将请求添加到队列
  182. if (isLoggingIn) {
  183. return new Promise((resolve, reject) => {
  184. pendingRequests.push(() => doRequest().then(resolve).catch(reject));
  185. });
  186. }
  187. // 如果没有在登录,开始登录流程
  188. isLoggingIn = true;
  189. try {
  190. // 使用单例登录Promise
  191. if (!loginPromise) {
  192. wx.removeStorageSync("accessToken");
  193. loginPromise = getApp().login();
  194. }
  195. await loginPromise;
  196. // 重置登录状态和Promise
  197. isLoggingIn = false;
  198. loginPromise = null;
  199. // 执行所有请求
  200. if (pendingRequests.length > 0) {
  201. console.log(wx.getStorageSync("accessToken"));
  202. pendingRequests.push(() => doRequest());
  203. return executePendingRequests();
  204. }
  205. return doRequest();
  206. } catch (loginError) {
  207. // 登录失败,重置状态
  208. isLoggingIn = false;
  209. loginPromise = null;
  210. pendingRequests = [];
  211. console.error("重新登录失败:", loginError);
  212. throw loginError;
  213. }
  214. }
  215. throw error;
  216. });
  217. };
  218. /**
  219. * 添加公共参数
  220. */
  221. export function postWithCommonParams(url, body, method = "POST") {
  222. const app = getApp();
  223. if (!body) {
  224. body = {};
  225. }
  226. if (app.globalData.uuid) {
  227. body.uuid = app.globalData.uuid;
  228. } else {
  229. body.uuid = "fuck";
  230. }
  231. body.gh_id = apple.ghid;
  232. // 判断是否为完整URL
  233. const isFullUrl = url.startsWith("http://") || url.startsWith("https://");
  234. const fullUrl = isFullUrl ? url : https.apiHttps + url;
  235. if (method === "POST") {
  236. return post(fullUrl, body);
  237. } else {
  238. return get(fullUrl);
  239. }
  240. }