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

2023-09-15 13:50:27

原生微信小程序中进行 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 请求时感谢大家的阅读
    如碰到其他的问题 可以私下我 一起探讨学习
    如果对你有所帮助还请 点赞 收藏谢谢~!
    关注收藏博客 作者会持续更新…

更多推荐

conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败

今天在尝试用conan1.60.0使用aarch64-linux-gnu编译器交叉编译boost/1.81.0时报错了:conaninstallboost/1.81.0@-pr:haarch64-linux-gnu.jinja-pr:bdefault--buildboost输出如下:Configuration(prof

Hyper-V 虚拟机CentOS配置网络(三)

总目录https://preparedata.blog.csdn.net/article/details/132877836文章目录总目录一、创建交换机二、共享网络给交换机三、虚拟机配置交换机四、配置CentOS网络一、创建交换机二、共享网络给交换机打开物理宿主机的控制面板的网络链接中心,此时已经多了一个上一步配置好虚

通过Vue-cli搭建spa项目

🏅我是默,一个在CSDN分享笔记的博主。📚📚🌟在这里,我要推荐给大家我的专栏《Vue》。🎯🎯🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都能满足你的需求。我会用最简单易懂的语言,带你走进Vue的世界,让你从零开始,一步步成为JAVA大师。🚀🏆🌈让我们在Vue的世界里畅游吧!🌈🎁如果感觉还

css前端面试题(三)

文章目录1、可继承属性和不可继承属性字体系列属性文本系列属性元素可见性列表布局属性光标属性2、link和@import的区别3、css优化4、CSS预处理器/后处理器是什么?为什么要使用它们?5、单行、多行文本溢出隐藏6、实现一个扇形7、实现一个自适应的正方形8、为什么现在的设备分辨率差异很大,2.5k屏幕都已经出现,

计算机网络 | I/O模型、网络模型(OSI七层及TCP/IP四层)

欢迎关注博主Mindtechnist或加入【LinuxC/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。I/O模型、网络模型I/O模型阻塞I/O非阻塞I/OI/

C—数据的储存(下)

文章目录前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数💫(2).浮点数的存储规定💫(3).浮点数的取出规定🌏3.例题😽总结前言👧个人主页:@小沈熬夜秃头中୧⍤⃝❅😚小编介绍:欢迎来到我的乱七八糟小星球�

计算机网络 | socket IPC(本地套接字domain)

欢迎关注博主Mindtechnist或加入【LinuxC/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。socketIPC(本地套接字domain)1.sock

[JavaScript游戏开发] 2D二维地图绘制、人物移动、障碍检测

系列文章目录第一章2D二维地图绘制、人物移动、障碍检测第二章跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示)第三章绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测第四章绘制Q版地图、键盘上下左右地图场景切换文章目录系列文章目录前言一、列计划1.1、目标1.2、步骤二、使用步骤2.1、准备素材(图片):草坪、人

认识 mysql 命令

文章目录1.简介2.选项3.子命令4.小结参考文献1.简介mysql是MySQL的命令行客户端,用于连接到MySQL服务器并执行SQL语句。它支持交互式和非交互式两种使用方式。以交互方式使用时,查询结果以ASCII表格式呈现。当以非交互方式使用时(例如,作为过滤器),结果以制表符分隔的格式显示。可以使用命令选项更改输出

第一个 vue-cli 项目

一、什么是vue-clivue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速;1.1主要的功能a、统一的目录结构b、本地调试c、热部署d、单元测试e、集成打包上线1.2

网络安全(黑客)自学

黑客,对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域,越深入越敬畏!学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.

热文推荐