原生微信小程序中进行 API 请求

原生微信小程序中进行 API 请求

当在原生微信小程序中进行 API 请求时,封装请求可以提高代码的可维护性和可扩展性。在本篇博客中,我们将一步步介绍如何进一步封装请求,并添加请求超时、拦截器和请求取消功能。

在这里插入图片描述

第一步:基本请求封装

首先,我们创建一个用于发送 HTTP 请求的基本封装。在微信小程序中,我们使用 wx.request 发送请求,这里我们将它封装成一个 Promise 风格的函数:

// request.jsfunction request(url, method, data, header = {}) {return new Promise((resolve, reject) => {wx.request({url: url,method: method,data: data,header: {'content-type': 'application/json', // 根据需求设置请求头...header,},success: (res) => {if (res.statusCode === 200) {resolve(res.data);} else {reject(new Error('请求失败'));}},fail: (err) => {reject(err);},});});
}export function get(url, data = {}, header = {}) {return request(url, 'GET', data, header);
}export function post(url, data = {}, header = {}) {return request(url, 'POST', data, header);
}

这段代码中,我们定义了两个函数 getpost,分别用于发送 GET 和 POST 请求,并返回一个 Promise,以便在请求成功或失败时进行处理。

第二步:请求超时

为了实现请求超时功能,我们可以使用 Promise 的 Promise.race 方法。我们创建一个新的 Promise,设置一个超时时间,然后将它与实际请求的 Promise 进行竞争。如果超时时间内请求未完成,我们可以取消请求并抛出一个超时错误。

// request.jsfunction requestWithTimeout(url, method, data, header = {}, timeout = 5000) {return new Promise((resolve, reject) => {const timer = setTimeout(() => {reject(new Error('请求超时'));}, timeout);wx.request({url: url,method: method,data: data,header: {'content-type': 'application/json', // 根据需求设置请求头...header,},success: (res) => {clearTimeout(timer);if (res.statusCode === 200) {resolve(res.data);} else {reject(new Error('请求失败'));}},fail: (err) => {clearTimeout(timer);reject(err);},});});
}export function getWithTimeout(url, data = {}, header = {}, timeout = 5000) {return requestWithTimeout(url, 'GET', data, header, timeout);
}export function postWithTimeout(url, data = {}, header = {}, timeout = 5000) {return requestWithTimeout(url, 'POST', data, header, timeout);
}

第三步:请求拦截器和响应拦截器

拦截器允许我们在请求发出前和响应返回后进行一些自定义操作,例如添加请求头、记录日志或处理错误信息。我们可以通过使用函数链来实现这一功能。首先,我们创建两个空数组 requestInterceptorsresponseInterceptors,用于存储拦截器函数。然后,我们通过一个函数来添加拦截器,每个拦截器都是一个函数,接受 config(请求配置)或 response(响应对象)作为参数,并可以对它们进行修改。最后,在请求或响应时,我们通过遍历这些拦截器数组,依次执行它们。

// request.jslet requestInterceptors = [];
let responseInterceptors = [];// 添加请求拦截器
export function addRequestInterceptor(interceptor) {requestInterceptors.push(interceptor);
}// 添加响应拦截器
export function addResponseInterceptor(interceptor) {responseInterceptors.push(interceptor);
}function executeInterceptors(interceptors, data) {return interceptors.reduce((prevData, interceptor) => {return interceptor(prevData);}, data);
}function request(url, method, data, header = {}, timeout = 5000) {// ...// 执行请求拦截器config = executeInterceptors(requestInterceptors, config);// ...// 执行响应拦截器responseData = executeInterceptors(responseInterceptors, responseData);// ...
}// ...

你可以使用 addRequestInterceptoraddResponseInterceptor 函数来添加自定义的拦截器,例如:

import { addRequestInterceptor, addResponseInterceptor } from './request';// 添加请求拦截器
addRequestInterceptor((config) => {// 在请求发出前进行一些操作,例如添加请求头config.header['Authorization'] = 'Bearer ' + getToken();return config;
});// 添加响应拦截器
addResponseInterceptor((response) => {// 在响应返回后进行一些操作,例如处理错误信息if (response.statusCode !== 200) {throw new Error('请求失败');}return response.data;
});

第四步:请求取消

为了实现请求取消功能,我们可以使用 Axios 风格的取消令牌(CancelToken)。我们需要创建一个 CancelToken 对象,并将它包含在请求的配置中。然后,在需要取消请求的地方,我们可以调用 cancel 方法取消请求。

// request.jslet cancelToken = new wx.miniProgram.CancelToken();function requestWithCancel(url, method, data, header = {}, timeout = 5000) {return new Promise((resolve, reject) => {wx.request({url: url,method: method,data: data,header: {'content-type': 'application/json', // 根据需求设置请求头...header,},cancelToken: cancelToken.token, // 设置取消令牌success: (res) => {if (res.statusCode === 200) {resolve(res.data);} else {reject(new Error('请求失败'));}},fail: (err) => {reject(err);},});});
}// 取消请求
export function cancelRequest() {cancelToken.cancel('请求取消');
}
进一步封装请求超时、拦截器和请求取消功能可以提高代码的灵活性和可维护性。以下是一个更完整的原生微信小程序 API 请求封装,包括这些功能:javascript
Copy code
// api.js// 创建一个取消请求的 CancelToken
const CancelToken = wx.miniProgram.CancelToken;// 默认配置
const defaultConfig = {baseURL: '', // 请求基础 URLtimeout: 5000, // 请求超时时间(毫秒)
};// 请求拦截器
function requestInterceptor(config) {// 在请求发送之前可以进行一些操作,例如添加请求头config.header = {'content-type': 'application/json',...config.header,};return config;
}// 响应拦截器
function responseInterceptor(response) {// 在收到响应后可以进行一些操作,例如处理错误信息if (response.statusCode !== 200) {throw new Error('请求失败');}return response.data;
}// 创建请求实例
const instance = wx.request.create({timeout: defaultConfig.timeout,header: {'content-type': 'application/json',},
});// 发送请求的函数
function sendRequest(config) {const { baseURL, timeout, ...restConfig } = { ...defaultConfig, ...config };const { url, method, data, params, cancelToken, ...otherConfig } = restConfig;// 合并请求 URLconst fullURL = `${baseURL}${url}`;// 创建 CancelToken 实例const source = CancelToken.source();// 设置取消令牌otherConfig.cancelToken = source.token;// 发送请求return instance({url: fullURL,method,data,params,...otherConfig,}).then(responseInterceptor).catch((error) => {if (wx.miniProgram.isCancel(error)) {// 请求被取消console.log('请求已取消');} else {// 请求发生错误console.error('请求失败:', error);}throw error;});
}export { sendRequest, requestInterceptor, responseInterceptor };

在上面的代码中,添加了以下功能:

  • 请求超时:可以通过设置 timeout 来指定请求超时时间,如果请求在规定时间内未完成,将会被取消。

  • 请求拦截器和响应拦截器:可以在发送请求前和处理响应后进行一些自定义操作,例如添加请求头或处理错误信息。

  • 请求取消:我们使用 Axios 的取消令牌(CancelToken)来支持请求取消功能。可以在请求配置中设置 cancelToken,然后在需要取消请求的地方调用 source.cancel()。

  • 使用这个进一步封装的请求函数 sendRequest,你可以在项目中更加灵活地处理网络请求,同时在拦截器中进行自定义操作,以满足不同场景的需求。在小程序的页面中,导入 sendRequest 并使用它来发起请求即可。
    在这里插入图片描述
    以上就是原生微信小程序中进行 API 请求时感谢大家的阅读
    如碰到其他的问题 可以私下我 一起探讨学习
    如果对你有所帮助还请 点赞 收藏谢谢~!
    关注收藏博客 作者会持续更新…

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

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

相关文章

混淆矩阵细致理解

1、什么是混淆矩阵 混淆矩阵(Confusion Matrix)是深度学习和机器学习领域中的一个重要工具,用于评估分类模型的性能。它提供了一个清晰的视觉方式来展示模型的预测结果与真实标签之间的关系,尤其在分类任务中,帮助我们…

【Unity基础】2.网格材质贴图与资源打包

【Unity基础】2.网格材质贴图与资源打包 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)网格材质纹理 第一次接触3D物体的话,会觉得好神奇啊,这个物体究竟是由什么组…

基于安卓Java试题库在线考试系统uniapp 微信小程序

本文首先分析了题库app应用程序的需求,从系统开发环境、系统目标、设计流程、功能设计等几个方面对系统进行了系统设计。开发出本题库app,主要实现了学生、教师、测试卷、试题、考试等。总体设计主要包括系统功能设计、该系统里充分综合应用Mysql数据库、…

Ae 效果:CC Particle Systems II

模拟/CC Particle Systems II Simulation/CC Particle Systems II CC Particle Systems II(CC 粒子系统 II)可用于生成和模拟各种类型的粒子系统,包括火焰、雨、雪、爆炸、烟雾等等。 与 CC Particle World 效果相比有许多类似的属性。最大的…

前端该了解的网络知识

网络 前端开发需要了解的网络知识 URL URL(uniform resource locator,统一资源定位符)用于定位网络服务. URL是一个固定格式的字符串 它表达了: 从网络中哪台计算机(domain)中的哪个服务(port),获取服务器上资源的路径(path),以及要用什么样的协议通信(schema). 注意: 当…

C# wpf 实现桌面放大镜

文章目录 前言一、如何实现?1、制作无边框窗口2、Viewbox放大3、截屏显示(1)、截屏(2)、转BitmapSource(3)、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…

卫星物联网生态建设全面加速,如何抓住机遇?

当前,卫星通信无疑是行业最热门的话题之一。近期发布的华为Mate 60 Pro“向上捅破天”技术再次升级,成为全球首款支持卫星通话的大众智能手机,支持拨打和接听卫星电话,还可自由编辑卫星消息。 据悉,华为手机的卫星通话…

【Unity每日一记】资源加载相关和检测相关

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

【计算机网络】Tcp详解

文章目录 前言Tcp协议段格式TCP的可靠性面向字节流应答机制超时重传流量控制滑动窗口(重要)拥塞控制延迟应答捎带应答标志位具体标志位三次握手四次挥手粘包问题TCP异常情况listen的第二个参数 前言 前面我们学习了传输层协议Udp,今天我们一…

使用FFmpeg+ubuntu系统转化flac无损音频为mp3

功能需求如上题,我们来具体的操作一下: 1.先在ubuntu上面安装FFmpeg:sudo apt install ffmpeg 2.进入有flac音频文件的目录使用下述命令: ffmpeg -i test.FLAC -c:a libmp3lame -q:a 2 output.mp3 3.如果没有什么意外的话,你就能看到你的文件夹里面已经有转化好的mp3文件了 批…

ubuntu中如何用docker下载华为opengauss数据库(超简单)

ubuntu中如何下载华为opengauss数据库 前言一、安装docker1.方法一:2.方法二 二、拉取openguass镜像三、创建容器四、连接数据库 ,切换到omm用户 ,用gsql连接到数据库五.最后用DateGrip远程连接测试(1)选择数据源(2)查看虚拟机ip地…

#循循渐进学51单片机#定时器与数码管#not.4

1、熟练掌握单片机定时器的原理和应用方法。 1)时钟周期:单片机时序中的最小单位,具体计算的方法就是时钟源分之一。 2)机器周期:我们的单片机完成一个操作的最短时间。 3)定时器:打开定时器“储存寄存器…

Python提取JSON数据中的键值对并保存为.csv文件

本文介绍基于Python,读取JSON文件数据,并将JSON文件中指定的键值对数据转换为.csv格式文件的方法。 在之前的文章Python提取JSON文件中的指定数据并保存在CSV或Excel表格文件内(https://blog.csdn.net/zhebushibiaoshifu/article/details/132…

Windows PostgreSql 创建多个数据库目录

1 使用默认用户Administrator 1.1初始化数据库目录 E:\Program Files\PostgreSQL\13> .\bin\initdb -D G:\DATA\pgsql\data3 -W -A md5 1.2连接数据库 这时User为Administrator,密码就是你刚才设置的,我设置的为123456,方便测试。 2 添加…

黑马JVM总结(九)

(1)StringTable_调优1 我们知道StringTable底层是一个哈希表,哈希表的性能是跟它的大小相关的,如果哈希表这个桶的个数比较多,元素相对分散,哈希碰撞的几率就会减少,查找的速度较快&#xff0c…

【微服务】六. Nacos配置管理

6.1 Nacos实现配置管理 配置更改热更新 在nacos左侧新建配置管理 Data ID:就是配置文件名称 一般命名规则:服务名称-环境名称.yaml 配置内容填写:需要热更新需求的配置 配置文件的id:[服务名称]-[profile].[后缀名] 分组&#…

Vuex详解:Vue.js的状态管理方案

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

启动微服务,提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

说明:启动一些微服务后,一直在报下面这个错误; com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not acc…

uniapp抽取组件绑定事件中箭头函数含花括号无法解析

版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7"... 箭头函数后含有花括号的时候, getData就拿不到val参数 , 解决办法就是去除花括号 // 错误代码: <SearchComp change"(val) > { getData({ val …

跨域问题解决方案(三种)

Same Origin Policy同源策略&#xff08;SOP&#xff09; 具有相同的Origin&#xff0c;也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同&#xff0c;那么该资源就将被认为是从不同的Origin得来的&#xff0c;进而不被允许访问。 Cross-origin resource…