当前位置: 首页 > article >正文

Uniapp 小程序接口封装与使用

深入理解 Uniapp 小程序接口封装与使用

在 Uniapp 小程序开发中,接口请求是获取和交互数据的关键部分。合理地封装接口不仅能提高代码的可维护性,还能增强项目的健壮性。今天,我们就来详细探讨一下如何在 Uniapp 中进行接口封装、引入以及使用。

一、接口封装原理

接口封装的核心目的是将复杂的请求逻辑进行抽象,使得在不同页面调用接口时更加简洁和统一。通过封装,我们可以集中处理诸如请求地址拼接、请求头设置、加载状态管理、错误处理以及登录状态验证等通用操作。

二、具体实现步骤

(一)创建请求封装文件

utils 目录下创建 request.js 文件,这是我们接口封装的核心代码所在。

// const BASEURL = 'http://xxx.xxx' 
const BASEURL = 'https://xxx.xxx.fun';/** 全局请求封装* @param path 请求路径* @param method 请求类型(GET/POST/DELETE等)* @param data 请求体数据* @param loading 请求未完成是是否显示加载中,默认为true* @param needToken 是否需要token,默认为false*/
export default (path, method, data = {}, loading = true, needToken = false) => {// 获取存储tokenconst token = uni.getStorageSync("token");// 判断token是否存在且接口是否需要tokenif (!token && needToken) {// const showToastMessage = (message) => {//     uni.showToast({//         icon: "none",//         title: message//     });// };// showToastMessage('请登录后操作');return;}if (loading) {uni.showLoading({title: "加载中",mask: true});};// 根据接口是否需要token以及token是否存在来决定调用的请求函数if (needToken && token!= '') {return tokenRequest(path, method, data, loading, token)} else {return noTokenRequest(path, method, data, loading)}
};// 无token时发送请求函数
function noTokenRequest(path, method, data, loading) {return new Promise((resolve, reject) => {uni.request({url: BASEURL + path,method: method,data,success(response) {// console.log('响应拦截');if (response.statusCode === 401) {// 若本地存在token,清除tokenconst token = uni.getStorageSync("token");if (token) {// uni.removeStorageSync('token');}// 提示用户请先登录uni.showToast({icon: "none",title: '请登录后操作',duration: 1000});return// 去登录}resolve(response.data);},fail(err) {uni.showToast({icon: "none",title: '服务响应失败'});console.error(err);reject(err);},complete() {uni.hideLoading();}});});
}// 有token时发送请求函数
function tokenRequest(path, method, data, loading, token) {return new Promise((resolve, reject) => {uni.request({url: BASEURL + path,method: method,data,header: {"token": token},success(response) {if (response.statusCode === 401) {// 清除本地存储的token// uni.removeStorageSync('token');// 提示用户请先登录// uni.showToast({//     icon: "none",//     title: '请登录后操作',//     duration: 1000// });return// 去登录}// console.log(response.data);resolve(response.data);},fail(err) {uni.showToast({icon: "none",title: '服务响应失败'});console.error(err);reject(err);},complete() {uni.hideLoading();}});});
}export {BASEURL
}

代码解析

  1. 基础 URL 定义:首先定义了 BASEURL,这是所有接口请求的基础地址。在实际项目中,根据后端接口的部署地址进行修改。
  2. 全局请求封装函数export default 导出的函数接收五个参数,分别是请求路径 path、请求类型 method、请求体数据 data、是否显示加载状态 loading 以及是否需要 token 的标识 needToken。在函数内部,首先获取本地存储的 token,如果接口需要 token 但 token 不存在,则直接返回,提示用户登录(这里的提示代码被注释,实际使用时可根据需求开启)。如果 loading true,则显示加载提示。最后根据是否需要 token 以及token 是否存在,调用不同的请求函数。
  3. 无token请求函数 noTokenRequest:返回一个 Promise,使用 uni.request 发起请求。在成功回调中,如果响应状态码为 401,表示未授权,若本地存在 token则清除(注释部分,可根据需求启用),并提示用户登录。若请求成功,将响应数据通过resolve返回。在失败回调中,显示错误提示并通过 reject 抛出错误。无论请求成功与否,在 complete 回调中隐藏加载提示。
  4. 有token请求函数 tokenRequest:与 noTokenRequest 类似,只是在请求头中添加了 token

(二)创建业务接口文件

utils目录下创建 user.js 文件,用于定义与用户相关的接口。

import request from './request.js'; // 封装的request.js文件的位置export const checkUser = (data) => {return request('/api/xxx/xxx', 'POST', data, true, true)
}

代码解析
通过导入 request.js 中封装的请求函数,定义了 checkUser 接口函数。该函数调用 request 并传入特定的请求路径、请求类型、请求数据、是否显示加载以及是否需要 token 等参数,从而实现对用户相关接口的封装。

三、接口的引入与使用

(一)在页面中引入接口

page/index/index.vue 页面中引入 user.js 中定义的接口。

import {checkUser
} from '@/utils/api/user.js'

(二)在页面方法中使用接口

async handleSend() {try {const res = await checkUser(this.id);// 这里可以对接口返回的数据进行进一步处理} catch (error) {// 捕获接口请求过程中的错误console.error('接口请求错误:', error);}
}

代码解析

  1. 使用 async/await 语法来处理异步请求,使得代码看起来更像是同步执行,提高代码的可读性。
  2. 在 try 块中调用 checkUser 接口,并传入 this.section_id 作为请求数据。接口返回的数据会赋值给 res,之后可以对res进行进一步的数据处理和业务逻辑操作。
  3. catch块中捕获接口请求过程中可能出现的错误,并进行相应的错误处理,比如在控制台打印错误信息。

四、总结

通过上述步骤,我们完成了 Uniapp小程序中接口的封装、引入和使用。这种封装方式使得代码结构更加清晰,每个部分各司其职,便于维护和扩展。在实际项目中,我们可以根据不同的业务模块创建更多的接口文件,进一步细化接口封装,提高开发效率。

希望这篇文章能帮助大家更好地掌握 Uniapp 小程序接口相关的开发技巧。如果在实践过程中有任何疑问或遇到问题,欢迎随时交流讨论。

相关文章:

Uniapp 小程序接口封装与使用

深入理解 Uniapp 小程序接口封装与使用 在 Uniapp 小程序开发中,接口请求是获取和交互数据的关键部分。合理地封装接口不仅能提高代码的可维护性,还能增强项目的健壮性。今天,我们就来详细探讨一下如何在 Uniapp 中进行接口封装、引入以及使…...

Python入门 — 类

面向对象编程中,编写表示现实世界中的事物和情景的类(class),并基于这些类来创建对象(object)。根据类来创建对象称为实例化,这样就可以使用类的实例(instance) 一、创建…...

vscode/cursor+godot C#中使用socketIO

在 Visual Studio Code(VS Code)中安装 NuGet 包(例如SocketIOClient),你可以通过以下几种方法: 方法 1:使用dotnet cli 打开终端:在 VS Code 中按下Ctrl 或者通过菜单View -> Terminal打开终端。 导…...

应用的负载均衡

概述 负载均衡(Load Balancing) 调度后方的多台机器,以统一的接口对外提供服务,承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…...

Kubernetes与Docker:区别与优劣总结

在云原生技术栈中,Docker和Kubernetes是两大核心工具,但它们的功能定位和使用场景截然不同。本文将从技术原理、架构设计、功能特性及适用场景等角度,深入分析两者的区别与优劣,并结合实际应用场景说明如何协同使用。 一、核心技术…...

区块链仿真工具SimBlock使用

1. Environment requirements SimBlock 可以在 Windows、MacOS、Ubuntu Linux 或任何支持 Java 的 Unix 平台上运行。 它需要以下版本的 JDK 和 Gradle。 请注意,SimBlock 的仓库中包含 Gradle Wrapper,因此您也可以自动安装 Gradle(我们稍…...

面试八股文--数据库基础知识总结(2) MySQL

本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…...

LeetCode 1472.设计浏览器历史记录:一个数组完成模拟,单次操作均O(1)

【LetMeFly】1472.设计浏览器历史记录:一个数组完成模拟,单次操作均O(1) 力扣题目链接:https://leetcode.cn/problems/design-browser-history/ 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage &#xff0c…...

江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍

前言:本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…...

【Uniapp-Vue3】导入uni-id用户体系

在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载,下载地址:uni-id-pages - DCloud 插件市场 进入以后下载插件,打开HbuilderX 选中项目,点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…...

如何免费使用稳定的deepseek

0、背景: 在AI辅助工作中,除了使用cursor做编程外,使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1,也给了自己不少启示。但是由于官网稳定性很差,很多…...

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …...

easyexcel和poi同时存在版本问题,使用easyexcel导出excel设置日期格式

这两天在使用easyexcel导出excel的时候日期格式全都是字符串导致导出的excel列无法筛选 后来调整了一下终于弄好了,看一下最终效果 这里涉及到easyexcel和poi版本冲突的问题,一直没搞定,最后狠下心来把所有的都升级到了最新版,然…...

git 国内源

git config --global url.“https://hub.fastgit.xyz/”.insteadOf “https://github.com/” git config --global url.“https://hub.fastgit.xyz/”.insteadOf “git://github.com/” 取消 FastGit 代理: git config --global --unset url.“https://hub.fastgit.xyz/”.in…...

Spring Boot @Async 注解深度指南

Spring Boot Async 注解深度指南 一、核心使用要点 启用异步支持 必须在启动类或配置类添加 EnableAsync,否则异步不生效。 SpringBootApplication EnableAsync public class Application { ... }线程池配置 默认问题:Spring 默认使用 SimpleAsyncTaskEx…...

Facebook Instant Game:即时游戏的新时代

一、Facebook Instant Game 简介 Facebook Instant Game(即时游戏)是一种基于 HTML5 技术的轻量级游戏平台,允许用户无需下载即可在Facebook Messenger 和 News Feed 中直接游玩。这种游戏模式降低了用户的进入门槛,使得游戏可以迅速传播,极…...

取topN不同算法的实现的性能差别

背景 最近在实现一个需求,需要对大量数据中排序出前N,最暴力的方法肯定是直接全量排序。这里很明显是可以不用全量排序的,取前N,我们自然而然可以想到一个算法——堆排序。 一开始自己先写好了一版,后来想起&#xff…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 为什么选择Elasticsearch?——典型应用场景深度解析1. 引言2. 日志分析:海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现: 2.…...

Spring Cloud Alibaba学习 3- Sentinel入门使用

Spring Cloud Alibaba学习 3- Sentinel入门使用 中文文档参考:Sentinel中文文档 一. SpringCloud整合Sentinel 1.1 下载Sentinel-Dashboard Sentinel下载地址:Sentinel-Dashboard 到下载目录,cmd输入 java -jar sentinel-dashboard-1.8…...

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大,本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考,也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…...

C语言 --- 经典习题1

C语言 --- 经典习题1 第 一 题 - - - 交 换 两 个 整 数 的 值(四 种 方 法)第 二 题 - - - 最 大 公 约 数 和 最 小 公 倍 数 之 和总结 💻作者简介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 &#x1…...

自定义mybatis拦截器,在springboot项目中不起作用的解决方法

自定义mybatis拦截器,在springboot项目中不起作用的解决方法 自定义mybatis拦截器,在若依springboot项目中不起作用的原因 找到 MyBatisConfig 配置类,引入自定义配置 在sqlSessionFactory中添加自定义拦截器,就可以正常使用了…...

记一次pytorch训练loss异常的问题

记一次pytorch训练loss异常的问题 问题描述 使用mmdetection框架训练时,某项loss出现异常大的值,比如1781232349724294.000。这个问题只在多卡训练时才会出现。 解决方法 在确认target和predction没有问题后,发现是在dataset中的数据处理…...

vue2使用d3.js实现网络拓扑图

vue2使用d3.js实现网络拓扑图 支持节点更换图标, 线条改变颜色 安装 npm i d37.9.0 --save自定义组件 <template><div style"width: 100%; height: 100%"><div ref"networkChart" class"network-chart"></div><e…...

记录一下在k3s快速创建gitlab

废话不多说&#xff0c;直接上配置文件 需要修改的地方&#xff08;备注都有写&#xff09;&#xff1a; 1.命名空间 namespace 2. claimName 文件挂载 Deployment kind: Deployment apiVersion: apps/v1 metadata:name: gitlabnamespace: cicd # 替换为您的命名空间la…...

AWQ和GPTQ量化的区别

一、前言 本地化部署deepseek时发现&#xff0c;如果是量化版的deepseek&#xff0c;会节约很多的内容&#xff0c;然后一般有两种量化技术&#xff0c;那么这两种量化技术有什么区别呢&#xff1f; 二、量化技术对比 在模型量化领域&#xff0c;AWQ 和 GPTQ 是两种不同的量…...

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…...

AI大模型-提示工程学习笔记20-多模态思维链提示

目录 1. 多模态思维链提示的核心思想 (1) 单模态 CoT 的局限性 (2) Multimodal CoT 的解决方案 2. Multimodal CoT 的工作流程 (1) 多模态输入 (2) 特征提取 (3) 多模态融合 (4) 思维链生成 (5) 答案生成 3. Multimodal CoT 的关键组件 (1) 大语言模型 (LLM) (2) 多…...

nginx 搭建 IPv6 -> IPv4 反向代理服务器

背景 在实际生产过程中&#xff0c;由于各种原因&#xff0c;我们的在线服务搭建在火山云服务器上&#xff0c;使用火山云包括 ECS、CLB、PLB 等组件进行网络通信&#xff0c;并且通过专线接受来自某公司内部流量。但是在大概 22~23 年&#xff0c;某公司要把所有网络流量变为…...

湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌

2025年2月11日&#xff0c;湖北中医药大学&谱度众合&#xff08;武汉&#xff09;生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行&#xff0c;湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…...