查看: 451|回复: 4

[javascript] js语法之定义http请求

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2025-10-11 00:52:51 | 显示全部楼层 |阅读模式
代码:

  1. import { useUserStore } from "@/stores";

  2. class Http {
  3.   constructor() {
  4.     // 开发环境使用本地mock,生产环境配置实际API
  5.     this.baseURL =
  6.       process.env.UNI_APP_API_BASE_URL ||
  7.       (process.env.NODE_ENV === "development"
  8.         ? "http://localhost:3000/api"
  9.         : "https://api.example.com");
  10.     this.timeout = 10000; // 缩短超时时间
  11.     this.loadingCount = 0;
  12.   }

  13.   // 显示loading
  14.   showLoading() {
  15.     if (this.loadingCount === 0) {
  16.       uni.showLoading({ title: "加载中...", mask: true });
  17.     }
  18.     this.loadingCount++;
  19.   }

  20.   // 隐藏loading
  21.   hideLoading() {
  22.     this.loadingCount--;
  23.     if (this.loadingCount <= 0) {
  24.       this.loadingCount = 0;
  25.       uni.hideLoading();
  26.     }
  27.   }

  28.   // 统一请求处理
  29.   async request(url, options = {}) {
  30.     const {
  31.       method = "GET",
  32.       data = {},
  33.       silent = false, // 静默请求,不显示loading和错误提示
  34.       ...config
  35.     } = options;

  36.     // 构建请求配置
  37.     const requestConfig = {
  38.       url: url.startsWith("http") ? url : this.baseURL + url,
  39.       method,
  40.       data,
  41.       timeout: this.timeout,
  42.       header: {
  43.         "Content-Type": "application/json",
  44.         ...config.header,
  45.       },
  46.       ...config,
  47.     };

  48.     // 添加token
  49.     const userStore = useUserStore();
  50.     if (userStore.token) {
  51.       requestConfig.header.Authorization = `Bearer ${userStore.token}`;
  52.     }

  53.     // 显示loading(静默请求除外)
  54.     if (!silent) {
  55.       this.showLoading();
  56.     }

  57.     try {
  58.       const response = await this.executeRequest(requestConfig);
  59.       return this.handleResponse(response);
  60.     } catch (error) {
  61.       return this.handleError(error, silent);
  62.     } finally {
  63.       if (!silent) {
  64.         this.hideLoading();
  65.       }
  66.     }
  67.   }

  68.   // 执行请求
  69.   executeRequest(config) {
  70.     return new Promise((resolve, reject) => {
  71.       uni.request({
  72.         ...config,
  73.         success: resolve,
  74.         fail: reject,
  75.       });
  76.     });
  77.   }

  78.   // 处理响应
  79.   handleResponse(response) {
  80.     const { statusCode, data } = response;

  81.     if (statusCode === 200) {
  82.       // 业务成功
  83.       if (data.code === 0 || data.success === true) {
  84.         return data.data || data;
  85.       }
  86.       // 业务失败
  87.       throw {
  88.         code: data.code,
  89.         message: data.message || "请求失败",
  90.       };
  91.     }

  92.     // HTTP错误
  93.     throw {
  94.       code: statusCode,
  95.       message: this.getStatusMessage(statusCode),
  96.     };
  97.   }

  98.   // 处理错误
  99.   async handleError(error, silent) {
  100.     // token过期处理
  101.     if (error.code === 401) {
  102.       const userStore = useUserStore();
  103.       userStore.logout();
  104.       uni.reLaunch({ url: "/pages/login/index" });
  105.       return Promise.reject(error);
  106.     }

  107.     // 显示错误提示(静默请求除外)
  108.     if (!silent) {
  109.       uni.showToast({
  110.         title: error.message || "网络错误",
  111.         icon: "none",
  112.       });
  113.     }

  114.     return Promise.reject(error);
  115.   }

  116.   // 获取状态码对应的错误信息
  117.   getStatusMessage(code) {
  118.     const messages = {
  119.       400: "请求参数错误",
  120.       401: "未授权,请重新登录",
  121.       403: "权限不足",
  122.       404: "请求的资源不存在",
  123.       500: "服务器内部错误",
  124.       502: "网关错误",
  125.       503: "服务不可用",
  126.     };
  127.     return messages[code] || "网络错误";
  128.   }

  129.   // GET请求
  130.   get(url, params, options = {}) {
  131.     return this.request(url, {
  132.       method: "GET",
  133.       data: params,
  134.       ...options,
  135.     });
  136.   }

  137.   // POST请求
  138.   post(url, data, options = {}) {
  139.     return this.request(url, {
  140.       method: "POST",
  141.       data,
  142.       ...options,
  143.     });
  144.   }

  145.   // PUT请求
  146.   put(url, data, options = {}) {
  147.     return this.request(url, {
  148.       method: "PUT",
  149.       data,
  150.       ...options,
  151.     });
  152.   }

  153.   // DELETE请求
  154.   delete(url, params, options = {}) {
  155.     return this.request(url, {
  156.       method: "DELETE",
  157.       data: params,
  158.       ...options,
  159.     });
  160.   }

  161.   // 文件上传
  162.   upload(url, filePath, formData = {}) {
  163.     return new Promise((resolve, reject) => {
  164.       const userStore = useUserStore();

  165.       this.showLoading();

  166.       uni.uploadFile({
  167.         url: url.startsWith("http") ? url : this.baseURL + url,
  168.         filePath,
  169.         name: "file",
  170.         formData,
  171.         header: {
  172.           Authorization: userStore.token ? `Bearer ${userStore.token}` : "",
  173.         },
  174.         success: (res) => {
  175.           try {
  176.             const data = JSON.parse(res.data);
  177.             if (data.code === 0 || data.success === true) {
  178.               resolve(data.data || data);
  179.             } else {
  180.               throw new Error(data.message || "上传失败");
  181.             }
  182.           } catch (error) {
  183.             reject(error);
  184.           }
  185.         },
  186.         fail: reject,
  187.         complete: () => {
  188.           this.hideLoading();
  189.         },
  190.       });
  191.     });
  192.   }
  193. }

  194. export default new Http();
复制代码
原文:https://gitcode.com/chenyCHENY/R ... n/src/utils/http.js
道不同,不相为谋!理想要有,万一实现了呢?

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
 楼主| 发表于 2025-10-11 01:02:03 | 显示全部楼层
道不同,不相为谋!理想要有,万一实现了呢?

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
 楼主| 发表于 2025-10-11 01:08:46 | 显示全部楼层
道不同,不相为谋!理想要有,万一实现了呢?

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
 楼主| 发表于 2025-10-11 01:13:46 | 显示全部楼层
道不同,不相为谋!理想要有,万一实现了呢?

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
 楼主| 发表于 2025-10-11 01:15:31 | 显示全部楼层
道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部