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

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

原生微信小程序中进行 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);
}


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


拦截器允许我们在请求发出前和响应返回后进行一些自定义操作,例如添加请求头、记录日志或处理错误信息。我们可以通过使用函数链来实现这一功能。首先,我们创建两个空数组 requestInterceptors 和 responseInterceptors,用于存储拦截器函数。然后,我们通过一个函数来添加拦截器,每个拦截器都是一个函数,接受 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 并使用它来发起请求即可。


452fc0d979e945b6bc746cbab77564b3.gif

以上就是原生微信小程序中进行 API 请求时感谢大家的阅读


如碰到其他的问题 可以私下我 一起探讨学习


如果对你有所帮助还请 点赞 收藏谢谢~!


关注收藏博客 作者会持续更新…

相关文章
|
13天前
|
JSON 小程序 JavaScript
原生微信小程序笔记完整总结
原生微信小程序笔记完整总结
28 1
|
4月前
|
机器学习/深度学习 人工智能 JSON
微信小程序原生AI运动(动作)检测识别解决方案
近年来,疫情限制了人们的出行,却推动了“AI运动”概念的兴起。AI运动已在运动锻炼、体育教学、线上主题活动等多个场景中广泛应用,受到互联网用户的欢迎。通过AI技术,用户可以在家中进行有效锻炼,学校也能远程监督学生的体育活动,同时,云上健身活动形式多样,适合单位组织。该方案成本低、易于集成和扩展,已成功应用于微信小程序。
|
4月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
1616 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
5月前
|
小程序 开发者
微信小程序之网络数据请求 wx:request的简单使用
这篇文章介绍了微信小程序中如何使用wx.request进行网络数据请求,包括请求的配置、请求的格式以及如何在开发阶段关闭请求的合法检验。
微信小程序之网络数据请求 wx:request的简单使用
|
6月前
|
存储 JavaScript 前端开发
探索React状态管理:Redux的严格与功能、MobX的简洁与直观、Context API的原生与易用——详细对比及应用案例分析
【8月更文挑战第31天】在React开发中,状态管理对于构建大型应用至关重要。本文将探讨三种主流状态管理方案:Redux、MobX和Context API。Redux采用单一存储模型,提供预测性状态更新;MobX利用装饰器语法,使状态修改更直观;Context API则允许跨组件状态共享,无需第三方库。每种方案各具特色,适用于不同场景,选择合适的工具能让React应用更加高效有序。
115 0
|
5月前
|
小程序 前端开发 API
微信小程序 - 调用微信 API 回调函数内拿不到 this 问题(解决方案)
本文讨论了在微信小程序中调用API回调函数时无法获取到`this`上下文的问题,并提供了解决方案。在回调函数中,使用一个变量(如`that`)来保存当前的`this`引用,然后在回调内部使用这个变量来访问当前页面的数据和方法。
|
5月前
|
小程序 PHP
微信小程序给 thinkphp后端发送请求出现错误 Wrong number of segments 问题的解决 【踩坑记录】
本文记录了微信小程序向ThinkPHP后端发送请求时出现"Wrong number of segments"错误的解决方法。问题原因是小程序请求header中的token变量名写错,导致token未正确传递至后端。作者提供了详细的检查步骤和建议,包括验证URL路径、参数规范和路由配置的匹配,以确保请求能正确发送和处理。
|
5月前
|
负载均衡 API 数据安全/隐私保护
Zookeeper的客户端-原生的API
Zookeeper的客户端-原生的API
|
4月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
917 7
|
4月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
894 1

热门文章

最新文章