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

news2024/11/17 17:40:21

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

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

在这里插入图片描述

第一步:基本请求封装

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

// request.js

function 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.js

function 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.js

let 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.js

let 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: '', // 请求基础 URL
  timeout: 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;

  // 合并请求 URL
  const 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.coloradmin.cn/o/1012017.html

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

相关文章

生产设备上的静电该如何处理?

在工厂生产车间里有很多机械设备,在生产运作过程中,难免会产生大量静电,静电会产生许多危害。 例如,1、会使电子设备故障、误操作而引起的电磁干扰。 2、电子元件或集成电路的静电击穿; 3、高压静电放电引起触电; 4、静电放电引起…

一种新的图像去噪方式:图像修补+斑点检测的预处理

灵感来源于我之前写的一篇博客:图像处理:基于cv2.inpaint()图像修补。 这种方式可以有效的去除白色的噪点,这里我们需要一张噪点的图像,你可以用下面的代码随机生成一张噪点图片: import cv2 import numpy as np # i…

EDI经营许可证办理要求及流程全解!

我们正处在互联网的大时代,从事互联网行业又会想到电商,提到电商企业,大家会关注这个平台是否合法或是否靠谱,那除了对这个电商品牌的认知以外,还会关注其是否合法合规为用户提供货物购买交易服务,是否具备…

评价模型:层次分析法

1. 模型建立 1.1 建立层次结构模型 在深入分析实际问题的基础上,将有关的各个因素按照不同属性自上而下地分解成若干层次,同一层的诸因素从属于上一层的因素或对上层因素有影响,同时又支配下一层的因素或受到下层因素的作用。最上层为目标层…

day10常用API

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) :应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要…

奶牛个体识别 奶牛身份识别

融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法 Light-weight recognition network for dairy cows based on the fusion of YOLOv5s and channel pruning algorithm 论文链接 知网链接 DOI链接 该文章讨论了奶牛花斑、光照条件、不同剪枝方法、不同剪枝率对准确率的影响…

【C语言】指针查漏补缺

【C语言】指针查漏补缺 预备知识一维整数数组字符数组字符常量数组字符串常量二维数组 预备知识 sizeof 是计算对象或者类型创建的对象所占内存空间的大小,单位是字节 sizeof 是操作符,不是函数 strlen 求字符串长度的,计算的是字符串中\0之…

向量的概念、向量组的概念

目录 向量的概念、向量组的概念 向量的基本运算 线性表出、线性相关、线性无关 向量的概念、向量组的概念 向量(Vector)是一个有次序的数所组成的数组,通常用来表示一个物理量或者一个对象在空间中的移动。向量可以表示位置、速度、力等物…

竞赛 基于机器视觉的手势检测和识别算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…

蓝牙核心规范(V5.4)12.2-深入详解之加密广播数据(Encrypted Advertising Data)

蓝牙篇之蓝牙核心规范(V5.4)深入详解汇总 1.知识回顾 1.1 带响应的周期广播 在上一节已经讲了。 1.2 广播结构体 蓝牙核心规范定义了广播数据(AD)结构。它是一个用于包含在蓝牙LE广告和扫描响应数据包中以及在蓝牙BR/EDR扩展查询响应(EIR)数据包中的一般容器。包含在A…

nvm 一个nodejs版本管理工具

nvm 一个nodejs版本管理工具 NVM是什么 nvm全英文也叫node.js version management,是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具,为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js NVM下载 可在点此在…

长城靶场溯源第四题

先统计访问的ip 直到第一个包过滤到202.1.1.2 很明显的一句话木马,就是他了,202.1.1.2 卡描述:2.服务器1.99的web服务器使用的CMS及其版本号(请直接复制) 继续查看同一个数据包,发现个奇奇怪怪的phpinf…

python flask框架接受axios发送的图片文件

文章目录 前端部分axios配置请求部分代码页面代码 后端代码结果 前端部分 axios配置 主要是一些基础的配置,这里可看可不看,主要的不是这里 import axios from axios; let baseURL /demo// 创建axios实例 const service axios.create({// axios中请…

山洪灾害预警方案(山洪预警解决方案的组成)

​ 随着气候变化的不断加剧,山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害,我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案,并成功在某地区进行了部署。 案…

【Linux从入门到精通】线程 | 线程介绍线程控制

本篇文章主要对线程的概念和线程的控制进行了讲解。其中我们再次对进程概念理解。同时对比了进程和线程的区别。希望本篇文章会对你有所帮助。 文章目录 一、线程概念 1、1 什么是线程 1、2 再次理解进程概念 1、3 轻量级进程 二、进程控制 2、1 创建线程 pthread_create 2、2…

代码随想录算法训练营第49天|121. 买卖股票的最佳时机,买卖股票的最佳时机II

链接: 121. 买卖股票的最佳时机 链接: 122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出…

代码托管的力量:构建协作、追踪和持续交付的软件开发生态系统

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 引言 在现代软件开发中…

浅析-vue.js

学习目标 会创建Vue实例,知道Vue的常见属性会使用Vue的生命周期的钩子函数会使用vue常见指令会使用vue计算属性和watch监控会编写Vue组件掌握组件间通信了解vue-router使用了解webpack使用会使用vue-cli搭建项目 0.前言 前几天我们已经对后端的技术栈有了初步的了…

Spark_Spark内存模型管理

工作中经常用到Spark内存调参,之前还没对这块记录,这次记录一下。 环境参数 spark 内存模型中会涉及到多个配置,这些配置由一些环境参数及其配置值有关,为防止后面理解混乱,现在这里列举出来,如果忘记了&a…

冠达管理:庄家最怕的8个方法?

在股票商场上,庄家总是短时刻内操控价格,并在一定的时刻内进出股市,以赚取巨额赢利。 假如想在股票商场上盈余,那么就必须站在庄家的对立面,把握一些防护和反击的办法。这里就来介绍一些庄家最怕的办法。 一、技能剖析…