微信小程序封装网络请求和拦截器实战步骤

yizhihongxing

下面我将详细讲解“微信小程序封装网络请求和拦截器实战步骤”的完整攻略。

步骤一:安装依赖

为了封装网络请求和拦截器,我们需要使用 wx.request API 进行网络请求,使用 Promise 进行异步编程,所以我们需要安装 Promise 的依赖 npm i bluebird --save,同时也需要安装 lodash 工具类库来简化代码 npm i lodash --save

步骤二:封装 request 方法

我们可以新建一个 api 文件夹,并在其中新建一个 request.js 文件用来封装 wx.request。其中,我们要使用 Promisewx.request 方法进行封装,以便于后续进行异步编程。

const Promise = require('../lib/bluebird.min.js')
const { isEmpty } = require('../lib/lodash.min.js')

/**
 * 发送http请求
 * @param {Object} options 微信请求的配置项
 * @return {Promise} Promise对象
 */
const request = (options) => {
  // 设置默认配置项
  const defaultOptions = {
    method: 'GET',
    header: {
      'Content-Type': 'application/json' // 默认值
    }
  }

  // 合并配置项
  const requestOptions = Object.assign(defaultOptions, options)

  return new Promise((resolve, reject) => {
    wx.request({
      ...requestOptions,
      success: ({ statusCode, data }) => {
        // 自定义业务状态码
        if (statusCode >= 200 && statusCode < 300) {
          resolve(data)
        } else {
          reject(data)
        }
      },
      fail: reject
    })
  })
}

module.exports = {
  request
}

在上述代码中,我们使用了默认配置项、合并配置项、Promise 异步编程等技巧,将 request 方法进行封装。这一封装的过程,可以使我们后续的代码维护以及添加拦截器等功能更加方便。

同时,我们在 success 回调中自定义了业务状态码,以便于后续的错误处理。

步骤三:添加请求拦截器

拦截器是对请求/响应进行预处理的中间件机制,它能够在请求发出时、响应返回时或中间某个时刻对请求/响应进行截获并处理。为了在拦截器中负责对请求进行鉴权等处理,我们可以在封装 request 方法时添加拦截器中间件。

const Promise = require('../lib/bluebird.min.js')
const { isEmpty } = require('../lib/lodash.min.js')

/**
 * 发送http请求
 * @param {Object} options 微信请求的配置项
 * @return {Promise} Promise对象
 */

 // 定义请求拦截器,其中 interceptors 定义为一个数组
const interceptors = []

const request = (options) => {
  // 设置默认配置项
  const defaultOptions = {
    method: 'GET',
    header: {
      'Content-Type': 'application/json' // 默认值
    }
  }

  // 合并配置项
  const requestOptions = Object.assign(defaultOptions, options)

  // 将请求拦截器拼接到配置项中
  requestOptions.interceptors = interceptors

  return new Promise((resolve, reject) => {
    wx.request({
      ...requestOptions,
      success: ({ statusCode, data }) => {
        // 自定义业务状态码
        if (statusCode >= 200 && statusCode < 300) {
          resolve(data)
        } else {
          reject(data)
        }
      },
      fail: reject
    })
  })
}

/**
 * 添加请求拦截器
 * @param {Function} fn 拦截器函数
 */
request.addInterceptor = (fn) => {
  interceptors.push(fn)
}

module.exports = {
  request
}

在上述代码中,我们定义了 interceptors 数组用于保存拦截器函数,并将它拼接到请求配置项中。

我们同时为 request 方法添加了一个静态方法 addInterceptor,用于添加拦截器。

步骤四:编写 token 鉴权拦截器

在实际业务中,我们通常需要对每个请求都进行 token 鉴权,以保证接口的安全性。因此,下面我们将编写一个 token 鉴权的拦截器。

const wxApi = require('../utils/wxApi')
const { tokenKey, apiPrefix } = require('../config')

/**
 * token 鉴权拦截器
 * @param {Object} options 请求配置项 
 * @return {Object} 请求配置项
 */
const tokenInterceptor = async (options) => {
  if (!options.noAuth) { // noAuth参数用于指定某个请求不需要鉴权
    const token = wx.getStorageSync(tokenKey)
    if (!token) {
      try {
        const loginResult = await wxApi.login()
        const response = await wxApi.request({
          url: `${apiPrefix}/token`,
          data: {
            code: loginResult.code
          }
        })
        wx.setStorageSync(tokenKey, response.token)
      } catch (e) {
        console.error(e)
        wx.redirectTo({
          url: '/pages/login/login'
        })
        return
      }
    }
    options.header.Authorization = `Bearer ${wx.getStorageSync(tokenKey)}`
  }

  return options
}

module.exports = tokenInterceptor

在上述的代码中,我们首先导入了一些常量和工具,然后定义了一个 tokenInterceptor 函数,该函数被设计成中间件形式,主要用于实现对 token 进行鉴权等操作。

tokenInterceptor 函数中,我们首先判断了是否存在 noAuth 属性,以完美支持某些请求不需要鉴权的需求。然后,我们通过 wxApi.login() 获取用户的 code,并将其发送给后端进行验证。如果鉴权成功,后端将会返回一个包含 token 的响应。我们将 token 存储到 StorageSync 中,以便于在后续的请求中使用。同时,我们在请求的 header 中添加了 Authorization,该头部用于携带鉴权信息。

步骤五:添加拦截器

为了让编写的拦截器生效,我们需要在调用 request 方法之前添加该拦截器。下面是一个示例:

const { request } = require('./request')
const tokenInterceptor = require('./tokenInterceptor')

// 添加拦截器,拦截器会依次在请求发出前按照添加的顺序被调用
request.addInterceptor(tokenInterceptor)

// 发送 HTTP 请求
request({
  url: 'http://www.baidu.com'
}).then((res) => {
  console.log(res)
}).catch((err) => {
  console.error(err)
})

在上述的示例代码中,我们首先导入了 request 和 tokenInterceptor 模块,然后使用 request.addInterceptor() 方法添加了拦截器。最后,我们调用 request 方法发送了 HTTP 请求。

步骤六:完善拦截器

对于 HTTP 请求,我们可以添加各种各样的拦截器实现不同的处理。例如,我们可以添加错误处理拦截器、日志输出拦截器、请求计时拦截器等。对于这些拦截器,我们可以依次添加到 request 中,实现功能的扩展。

每个拦截器一般都需要实现一个中间件,以便于在每个请求发出前、返回前或者错误发生时进行处理。在实现每个中间件时,我们都可以依据实际业务需求进行适当的修改和扩展。例如,在错误处理的中间件中,我们可以根据错误码进行不同级别的日志输出以及错误提示等功能。

至此,我们已经实现了微信小程序封装网络请求和拦截器的完整攻略。在实际开发中,你可以根据需要进行适当的拓展和优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序封装网络请求和拦截器实战步骤 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • layui表格搜索功能

    layui表格搜索功能 在网站开发中,数据的展示与搜索是一个很常见的需求。而在前端框架中,layui 是一个广受欢迎的UI框架,也提供了便捷的表格组件。本文将介绍如何在 layui 表格中添加搜索功能。 基本思路 Layui 表格中没有原生的搜索功能,但提供了许多基础组件,可以根据实际需要实现搜索功能。基本的实现思路如下: 获取用户输入的搜索关键字。 遍历表…

    其他 2023年3月28日
    00
  • Netty分布式Server启动流程服务端初始化源码分析

    Netty分布式Server启动流程服务端初始化源码分析 概述 Netty是一个高性能的基于Java NIO的网络编程框架,可以实现异步的、事件驱动的网络应用程序。 本文将对Netty分布式Server启动流程的服务端初始化源码进行详细分析,从源码实现的角度解析Netty分布式Server启动流程,并提供两个具体的示例来说明。 Netty分布式Server启…

    other 2023年6月20日
    00
  • mac安装conda后,终端的用户名前面有一个(base),最佳解决方案

    Mac安装conda后,终端的用户名前面有一个(base),最佳解决方案 当使用conda在Mac中管理Python环境时,你可能会发现在终端中的用户名前面有一个(base)字样提示。这是因为conda在安装时默认会创建一个名为“base”的虚拟环境,并将其设为默认环境。 以下是解决此问题的最佳方法: 步骤1:查看conda虚拟环境 打开终端,运行以下命令查…

    其他 2023年3月28日
    00
  • 大小写提示符号A怎么开启或关闭?

    要开启或关闭大小写提示符号A,您可以按照以下步骤进行操作: 打开您的设备的设置菜单。这通常可以在屏幕上找到一个齿轮或一个带有设置图标的选项。 在设置菜单中,找到“键盘”或“语言和输入”选项,并点击进入。 在键盘设置中,您可能需要滚动屏幕以查找“高级设置”或类似的选项。点击进入该选项。 在高级设置中,您应该能够找到“大小写提示符号”或类似的选项。点击进入该选项…

    other 2023年8月16日
    00
  • 详解C++ STL模拟实现list

    让我来详细讲解一下“详解C++ STL模拟实现list”的完整攻略。 1、前言 在C++ STL标准库中,list是一个双向链表容器。它提供了快速插入和删除操作,但是访问元素的效率较低。在实际的编程实践中,我们可能需要实现自己的list容器类,以便更好地掌握该容器的原理和使用。本文将详解如何在C++中模拟实现list容器类。 2、List的定义 list容器…

    other 2023年6月26日
    00
  • Asp.net自定义控件之加载层

    Asp.net自定义控件之加载层 加载层是一个常见的UI组件,用于在执行网络请求或其它耗时操作时,向用户展示正在加载的进度。本文将介绍如何使用Asp.net自定义控件构建一个简单的加载层组件。 第一步:定义控件 在项目中添加一个自定义控件,比如LoadPanelControl.ascx,然后在控件中添加以下代码: <div id="loadP…

    other 2023年6月26日
    00
  • eclipse配置文件导出问题

    Eclipse配置文件导出问题 当我们在Eclipse中开发项目时,在配置各种插件、环境变量等时,可能会面对需要一次性导出所有配置的问题。因此,Eclipse提供了导出配置文件的功能,本文将介绍这一功能的使用方法以及可能出现的问题与解决方案。 一、导出配置文件 打开Eclipse,点击菜单栏的“文件” -> “导出”,选择“General”下的“导出模…

    其他 2023年3月28日
    00
  • PHP中的超全局变量

    PHP中的超全局变量 在PHP中,超全局变量是一种特殊的变量,它们在脚本的任何地方都可用,无需特别声明或引入。这些变量在PHP中被称为超全局变量,因为它们在全局范围内自动可用。 以下是PHP中的几个常见的超全局变量: 1. $_GET $_GET 是一个关联数组,用于获取通过URL参数传递给当前脚本的值。它可以用于从URL中获取数据,例如表单提交或链接点击。…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部