本文基于微信小程序原生 API,封装 requestuploadFile 接口,最终实现统一请求管理、请求拦截、错误处理等能力。


📦 一、为什么要封装网络请求?

微信小程序提供了 wx.requestwx.uploadFile 原生 API,但直接使用存在以下问题:

  • 重复代码多:每次都要写 header、拼接 URL、处理 loading、异常等;
  • 缺少统一错误处理:每个请求都得自己 try-catch;
  • 不好管理 token 等公共逻辑:无法统一加请求头;
  • 调试困难:没有统一日志输出或接口追踪;

封装后,我们可以统一管理所有接口请求,提升开发效率与代码可维护性。


🏗️ 二、项目结构建议

/utils├── request.ts        # 通用网络请求封装├── upload.ts         # 上传封装└── config.ts         # 环境配置

⚙️ 三、基础配置 config.ts

// utils/config.tsexport const BASE_URL = 'https://api.example.com';export const DEFAULT_HEADER = {'Content-Type': 'application/json',
};export function getToken(): string {// 假设从本地获取缓存 tokenreturn wx.getStorageSync('token') || '';
}

🌐 四、封装通用 request 请求 request.ts

// utils/request.tsimport { BASE_URL, DEFAULT_HEADER, getToken } from './config';interface RequestOptions<T> {url: string;method?: 'GET' | 'POST' | 'PUT' | 'DELETE';data?: any;header?: Record<string, string>;showLoading?: boolean;timeout?: number;
}export function request<T = any>(options: RequestOptions<T>): Promise<T> {const {url,method = 'GET',data = {},header = {},showLoading = true,timeout = 10000,} = options;return new Promise((resolve, reject) => {if (showLoading) {wx.showLoading({ title: '加载中...', mask: true });}wx.request({url: BASE_URL + url,method,data,header: {...DEFAULT_HEADER,...header,Authorization: `Bearer ${getToken()}`, // 添加 token},timeout,success(res) {if (res.statusCode === 200) {resolve(res.data);} else {wx.showToast({ title: `错误 ${res.statusCode}`, icon: 'none' });reject(res);}},fail(err) {wx.showToast({ title: '网络异常', icon: 'none' });reject(err);},complete() {if (showLoading) {wx.hideLoading();}},});});
}

🖼️ 五、上传封装 upload.ts

// utils/upload.tsimport { BASE_URL, getToken } from './config';export interface UploadFileOptions {url: string;filePath: string;name?: string;formData?: Record<string, string>;showLoading?: boolean;
}export function uploadFile(options: UploadFileOptions): Promise<any> {const {url,filePath,name = 'file',formData = {},showLoading = true,} = options;return new Promise((resolve, reject) => {if (showLoading) {wx.showLoading({ title: '上传中...', mask: true });}wx.uploadFile({url: BASE_URL + url,filePath,name,formData,header: {Authorization: `Bearer ${getToken()}`,},success(res) {if (res.statusCode === 200) {try {resolve(JSON.parse(res.data)); // 注意返回是字符串} catch (e) {reject(e);}} else {wx.showToast({ title: '上传失败', icon: 'none' });reject(res);}},fail(err) {wx.showToast({ title: '上传异常', icon: 'none' });reject(err);},complete() {if (showLoading) {wx.hideLoading();}},});});
}

✅ 六、实际使用案例

示例:获取用户信息

// pages/user/index.tsimport { request } from '../../utils/request';Page({onLoad() {request({url: '/user/info',method: 'GET',}).then((res) => {console.log('用户信息', res);}).catch(console.error);},
});

示例:上传头像

// pages/upload/index.tsimport { uploadFile } from '../../utils/upload';Page({uploadAvatar() {wx.chooseImage({count: 1,success: (res) => {const filePath = res.tempFilePaths[0];uploadFile({url: '/upload/avatar',filePath,}).then((res) => {console.log('上传成功', res);}).catch(console.error);},});},
});

📚 七、总结

通过本教程,我们实现了小程序中通用的 requestuploadFile 的封装,具备了:

  • ✅ 支持 token 自动注入
  • ✅ 支持 loading 提示与关闭
  • ✅ 支持统一错误提示
  • ✅ 支持上传功能
  • ✅ 接口调用代码更清晰简洁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86272.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86272.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86272.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试基础知识详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、软件测试定义 软件测试是指在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行…

Spring Boot 文件上传大小配置错误解决方案

问题描述 在Spring Boot应用中出现以下错误&#xff1a; Failed to bind properties under spring.servlet.multipart.max-file-size’ to org.springframework.util.unit.Datasize Property:spring.servlet.multipart.max-file-sizeValue: 10Mb Origin: URL [file:./applicat…

Matplotlib绘制矩阵图,plt.matshow/imshow 与 ax.pcolor(pcolormesh)方法的使用

文章目录 plt.matshow离散colorbar连续colorbar ax.pcolor简单应用综合应用 import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import ListedColormap#data np.random.seed(42) data np.random.rand(4, 4)plt.matshow 可以把下面的matshow换成ims…

关于 ARM64 汇编:调用流程与栈帧结构解析

一、ARM64 函数调用分析&#xff08;汇编级&#xff09; 寄存器规则&#xff08;AArch64 ABI&#xff09; 用途寄存器参数传递x0 ~ x7返回值x0&#xff08;最多两个&#xff1a;x0、x1&#xff09;栈指针sp链接寄存器x30&#xff08;lr&#xff09;帧指针x29&#xff08;fp&a…

Kafka vs RabbitMQ vs Redis:消息中间件全面对比与选型指南

Kafka vs RabbitMQ vs Redis&#xff1a;消息中间件全面对比与选型指南 一、各中间件消息流转全过程Kafka 消息流转全过程&#xff08;含机制详解&#xff09;1. 核心组件2. 流程详解 RabbitMQ 消息流转全过程&#xff08;含机制详解&#xff09;1. 核心组件2. 流程详解 Redis …

【代码级指南】从Zero-shot到Chain-of-Thought:Prompt工程全栈技术解析​

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。 从理论到实践&#xff0c;掌握Zero-shot/Few-shot Prompt设计精髓。 一、Prompt Engineering 核心概念图解 Prompt Engineering 三大支柱 二、Prompt 设计基础框架 1. Prompt 核心四要素 prompt_template "&q…

sizeof()函数无法计算形参指针指向的字符串大小

给定的代码中&#xff0c;func() 函数打印的 name_len 是 指针的大小&#xff0c;而不是字符串的长度。具体原因如下&#xff1a; 代码分析 #include <stdio.h> #include <string.h>void func(char *name) {printf("name_len:%d", sizeof(name)); // 打…

Python打卡:Day37

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 浙大疏锦行

Android 9.0(API 28)后字重设置

在 Android 应用中设置字体字重&#xff08;Font Weight&#xff09;可以通过多种方式实现&#xff0c;下面详细介绍各种方法及其适用场景。 1. 使用 XML 属性设置字重 1.1 基本字重设置&#xff08;API 1&#xff09; <TextViewandroid:layout_width"wrap_content&…

WebRTC(十):RTP和SRTP

RTP&#xff08;Real-time Transport Protocol&#xff09; 作用 RTP 用于传输实时媒体流&#xff08;如音频、视频&#xff09;&#xff0c;它不提供可靠传输&#xff0c;而是关注低延迟、高实时性。 报文结构 整体结构 RTP 报文由以下部分组成&#xff1a; RTP Header …

微服务架构下面临的安全、合规审计挑战

微服务架构在带来敏捷性、可扩展性等优势的同时&#xff0c;也给安全和合规审计带来了巨大的挑战。这些挑战主要源于微服务的 分布式特性、动态性以及数量庞大 等特点。 以下是微服务架构下安全和合规审计面临的具体挑战 一、安全审计挑战 1. 攻击面扩大和复杂性增加 服务数…

显卡等驱动程序的介绍与安装

文章目录 1. 什么是驱动程序2. 电脑的驱动程序有哪些3. 电脑的驱动程序的安装4. 独立显卡驱动程序的安装5. 现代化驱动程序的安装6. 驱动程序既然这么重要&#xff0c;为什么我不都下一遍呢&#xff1f; 1. 什么是驱动程序 假设我们现在成功组装了一台台式机&#xff0c;那我们…

【Python】高光谱数据分析

特征提取 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cross_decomposition import PLSRegression from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression# 设置matplotlib支持中文…

nt!CcGetVirtualAddressIfMapped函数中的nt!CcGetVacbLargeOffset函数分析--重要

第一部分&#xff1a; 1: kd> kc # 00 nt!CcGetVirtualAddressIfMapped 01 nt!CcFlushCache 02 Ntfs!LfsFlushLfcb 03 Ntfs!LfsFlushToLsnPriv 04 Ntfs!LfsWriteLfsRestart 05 Ntfs!LfsWriteRestartArea 06 Ntfs!NtfsCheckpointVolume 07 Ntfs!NtfsCheckpointAllVolumes 0…

K8s入门指南:架构解析浓缩版与服务间调用实战演示

目录 前言一、k8s概念理解1、k8s整体架构&#xff08;1&#xff09; Master 主节点&#xff08;2&#xff09; Node 工作节点&#xff08;3&#xff09; Etcd 键值存储数据库 &#xff12;、Pod被视为最小的部署单元&#xff13;、k8s的五种控制器类型&#xff08;1&#xff09…

【ubuntu下小工具】Crontab定时任务进行数据备份和清理

背景 在生产环境的深度学习项目中&#xff0c;系统每日会持续生成大量数据。如果不进行有效管理&#xff0c;随着时间的推移&#xff0c;磁盘空间将被占满&#xff0c;最终导致服务器瘫痪。 为解决这一问题&#xff0c;需设置一个定时任务去执行脚本&#xff0c;用以完成&#…

3dgs涉及的基本概念:球谐系数(SH 系数)等

1.球谐系数&#xff08;SH 系数&#xff09; ──────────────────────────────────────── 1.1 什么是球谐函数 (Spherical Harmonics&#xff0c;缩写为 SH) 球谐函数是一组定义在单位球面上的一组正交函数&#xff0c;类似于在二维平…

sql格式化自动识别SQL语法结构

一、安装包 PoorMansTSqlFormatterLib 二、代码实现 using Microsoft.AspNetCore.Mvc; using PoorMansTSqlFormatterLib.Formatters; using PoorMansTSqlFormatterLib.Parsers; using PoorMansTSqlFormatterLib.Tokenizers;namespace SaaS.OfficialWebSite.Web.Controllers …

LVS-DR负载均衡群集深度实践:高性能架构设计与排障指南

目录 一、核心原理与理论 二、背景与架构设计 三、全流程部署步骤 1. NFS共享存储配置&#xff08;192.168.7.100&#xff09; 2. Real Server节点配置&#xff08;四台服务器&#xff09; 3. Director服务器配置 四、常见问题解决方案 五、生产环境总结 拓扑示意图&am…

Hall 定理学习笔记

定义 对于一张二分图 G ( V , E ) G(V,E) G(V,E)&#xff0c;设其左右部点集分别为 V L , V R V_L,V_R VL​,VR​&#xff0c;不妨认为 ( ∣ V L ∣ ≤ ∣ V R ∣ ) (|V_L|\leq |V_R|) (∣VL​∣≤∣VR​∣)&#xff0c;定义该二分图的一组 完备匹配 为左部 ∣ V L ∣ |V…