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

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) => {
    // 获取存储token
    const token = uni.getStorageSync("token");

    // 判断token是否存在且接口是否需要token
    if (!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,清除token
                    const 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 小程序接口相关的开发技巧。如果在实践过程中有任何疑问或遇到问题,欢迎随时交流讨论。

相关文章:

  • 使用 Postman 访问 Keycloak 端点
  • 强化学习演进:GRPO 从何而来
  • 数组总结【代码随想录】
  • Docker数据卷操作实战
  • centos22.04 dpkg -l 输出状态标识含义
  • HTTP非流式请求 vs HTTP流式请求
  • 金融行业专题|某基金公司基于超融合信创平台支持人大金仓数据库的性能评测
  • 深入解析Tomcat目录结构
  • Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决
  • 【MATLAB中的图像数据结构】
  • 【奥卡姆剃刀原理-如何理解云计算和边缘计算 关键字摘取】
  • MATLAB下载安装教程(附安装包)2025最新版(MATLAB R2024b)
  • 网络安全之日志审计 网络安全审计制度
  • 山东大学软件学院ai导论实验之生成对抗网络
  • 【Python爬虫(71)】用Python爬虫解锁教育数据的奥秘
  • obj离线加载(vue+threejs)+apk方式浏览
  • DDNS-GO 动态域名解析
  • 基于YOLO11深度学习的医学X光骨折检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
  • 基于SpringBoot的“洪涝灾害应急信息管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 【Java】I/O 流篇 —— 转换流与序列化流
  • 美加征“对等关税”后,调研显示近半外贸企业将减少对美业务
  • IPO周报|4月最后2只新股周一申购,今年以来最低价股来了
  • 程璧“自由生长”,刘卓辉“被旋律牵着走”
  • 新任浙江省委常委、组织部长杨荫凯到嘉兴南湖瞻仰红船
  • 政治局会议深读|首提“持续巩固房地产市场稳定态势”,楼市政策还有哪些优化空间
  • 对外投资增长、消费市场持续升温,中国经济砥砺前行