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

这篇具有很好参考价值的文章主要介绍了原生微信小程序中进行 API 请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

第一步:基本请求封装

首先,我们创建一个用于发送 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 请求,微信小程序,notepad++,小程序
    以上就是原生微信小程序中进行 API 请求时感谢大家的阅读
    如碰到其他的问题 可以私下我 一起探讨学习
    如果对你有所帮助还请 点赞 收藏谢谢~!
    关注收藏博客 作者会持续更新…文章来源地址https://www.toymoban.com/news/detail-726579.html

到了这里,关于原生微信小程序中进行 API 请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】使用 wx.request 方法进行异步网络请求

    在微信小程序中,你可以使用 wx.request 方法进行异步网络请求,并将获取到的列表数据渲染到 UI 上。 首先,在页面的 data 中定义一个数组变量,用于存储获取到的列表数据,例如: 然后,在页面的生命周期函数 onLoad 或需要触发网络请求的函数中,使用 wx.request 方法发送异

    2024年02月16日
    浏览(40)
  • 微信小程序如何使用原生Websocket api与Asp.Net Core SignalR 通信

    如题,这可能算是.net 做小程序的服务端时,绕不开的一个问题,老生常谈了。同样的问题,我记得我2018/19年的一个项目的解决方案是: 修改官方的SignalR.js的客户端 :把里面用到浏览器的Websocket改成微信小程序的官方api的。目前网上也有不少这样的方案,已经改好开源了;

    2024年02月09日
    浏览(65)
  • 09-微信小程序 网络请求API(实现轮播广告和简易的聊天窗口)

    09-微信小程序API网络请求(实现轮播广告和简易的聊天窗口) 做项目的开发,一定离不开网络相关的操作,小程序做的都是客户端,客户端请求服务端做一些交互。 微信小程序提供的API的方式,通过API的方式可以调用微信提供的强大的功能,以增强小程序的功能,如:网络请

    2024年02月11日
    浏览(29)
  • 【微信小程序】调用百度API进行图像识别(以植物识别为例)

    需要素材与源码可联系笔者,项目文件过多不适宜全部展示。 微信小程序调用百度API可分为以下三步: 注册百度智能云账号,并开通植物识别API 在小程序中调用 渲染在小程序页面上 移步百度只能云平台https://cloud.baidu.com/ 注册好账号之后,把鼠标放在 产品 上,侧边会展开

    2024年02月05日
    浏览(40)
  • 【微信小程序入门到精通】— 配置合法域名、进行网络数据请求(GET、POST)

    对于目前形式,微信小程序是一个热门,那么我们该如何去学习并且掌握之后去做实际项目呢? 为此我特意开设此专栏,在我学习的同时也将其分享给大家! 本篇文章主要给大家带来进行网络数据请求的方法,那么接下来我们一起学起来吧! 如果在往下阅读的过程中,有什

    2024年02月03日
    浏览(46)
  • 微信小程序--原生

    1:常见的几种场景 2:动态绑定内容 3:动态绑定属性 4:三元运算 4:算数运算 1:定义数据 2:渲染结构 3:美化样式 4:绑定input事件处理函数 1:运行方式不同 2:使用场景 1:rpx尺寸单位 1:什么是rpx尺寸单位 2:rpx的实现原理 3:rpx与px之间的单位换算*(*了解就行) 2:

    2024年02月13日
    浏览(30)
  • 前端笔记--微信小程序(原生)

    介于工作需要,这里总结一下微信小程序的开发。 官网:微信小程序 开发文档:微信开放文档 vscode安装插件:   ‘ wxml 对应 html wxss 对应 css js 逻辑层 json 数据配置层 同样也是MVVM模型 (1)app.json pages :该项目的所有页面,字符串对应文件路径,但是不要加后缀名。 我们可

    2024年02月11日
    浏览(29)
  • 微信小程序 之 原生开发

    小程序的核心技术主要是三个: 页面布局:WXML ,类似HTML 页面样式:WXSS ,几乎就是CSS(某些不支持,某些进行了增强,但是基本是一致的) 页面脚本: JavaScript+WXS(WeixinScript) 网址 : 微信小程序 网址 : 微信开发者工具下载地址与更新日志 | 微信开放文档 Vue的MVVM和小程序MVV

    2023年04月08日
    浏览(40)
  • 原生小程序 微信小程序 使用ucharts

    背景:    原生小程序需要好看的折线图。 实现: 小程序开发版本 一般是uni-app项目使用ucharts在原生微信小程序也是可以使用。 方法: 源码下载: uCharts: 高性能跨平台图表库,支持H5、APP、小程序(微信小程序、支付宝小程序、钉钉小程序、百度小程序、头条小程序、QQ小

    2024年02月09日
    浏览(30)
  • 微信小程序原生写法传递参数

        data-xxx   自定义参数名  ,接收参数:方法(变量名)  如果需要传递多个,可以写多个data-[参数]的方式进行传递 多个参数写法 data-a ,data-b, 接收参数 :方法(变量名)    建议采用全小写命名,简短短拼~

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包