小程序开发指南-TS封装wx.request

这篇具有很好参考价值的文章主要介绍了小程序开发指南-TS封装wx.request。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小程序开发指南-TS封装wx.request

大家好,我是Aliom252181,一个佛系且资质平平的前端coder,今天分享下我是如何使用Typescript封装wx.request的。

写在前面

本篇文章适合有封装TS版本小程序请求需求的coder,通过本篇阅读,你将会了解到:

  • TS代码提示;
  • 单例模式;
  • 每个接口都可以灵活配置请求头、超时时间等;
  • 取消原生嵌套地狱写法,更符合阅读逻辑。

微信小程序自带的wx.request请求方式使用方式如下:

wx.request({
      url: 'http://host/api/key', //请求的接口地址
      method:"get",               //http请求数据的方式
      data:{name:'',age:''},      //请求的参数,如name和id
      //请求头设置,根据需要自己设置
      header:{
        'content-type':"application/json"
      },
      //请求成功时的回调函数
      success(res){
        console.log(res);
      },
      //请求失败的回调函数
      fail(msg){
          console.log(msg);
      }
    })

如果不封装的话,每次使用请求都会造成大段重复代码占用代码区,对阅读极其不利,也降低了开发效率,为了解决这个问题,一起来开启封装之旅吧。

基础类型封装

首先我们要先定义一些我们需要的类型,例如请求参数类型,返回数据类型,还有一些枚举类型,现在开始封装:

封装HTTP请求配置

// HTTP请求方法枚举
export enum HttpMethod {
  GET,
  POST
}

// HTTP请求配置
interface RequestConfig {
  /** API路径 */
  url?: string
  /** Method类型 */
  method?: HttpMethod
  /** 接口返回数据 */
  data?: any
  /** 无TOKEN触发异常捕获时,是否执行异常逻辑 */
  needToken?: boolean
  /** Header头部 */
  header?: object
}

其中needToken是我们的业务逻辑,此参数主要作用于一些需要权限接口,如果我们不想让他在request层级触发我们的逻辑,例如不想触发登录验证,就可以在接下来处理返回code时使用。

封装请求返回数据类型

// 继承中间类型,data声明为any
interface AnyResult extends WechatMiniprogram.RequestSuccessCallbackResult {
  data: any
}
// 从中间类型继承一个泛型接口,data声明为泛型
interface SpecResult<T> extends AnyResult {
  data: T
}
// 声明业务数据类型
export interface MyAwesomeData {
  code: number
  msg: string
  data: any
}

这一步是定义返回参的类型,我们希望最终的返回结果为{code,msg,data},便于我们的使用。其中注意WechatMiniprogram是微信提供的类型,需要大家在TS小程序项目内使用,也可以使用NPM包miniprogram-api-typings来作为校验,如果是后者,要注意在tsconfig.jsontypeRoots字段内设置此包地址,例如:

"typeRoots": [
    "./node_modules/miniprogram-api-typings"
 ],

环境配置

除了正式环境,大家的日常开发中免不了要进行多环境切换,这里写成配置,方便开发使用。

首先新建env.ts文件作为环境配置中心,这里我已常用的三环境为例,大家自行扩展。

// env.ts
let envs = {
  dev: {
    host: 'http://192.168.0.1:20087/',
    imgHost: 'http://192.168.0.2:20087/'
  },
  test:{
    host: 'http://192.168.0.1:20086/',
    imgHost: 'http://192.168.0.2:20086/'
  },
  prod: {
    host: 'https://XXXXX.com/',
    imgHost: 'http://image.XXXXX.com/'
  },
}

module.exports = envs

接下来新建config.ts文件作为小程序配置中心,用来控制环境切换和其他配置。

// config.ts

// 基础共同的配置
let baseConfig = {
  // 小程序appid
  appid: '……',
  // 环境
  ENV:'dev'
}

//环境文件
let envConfig = require('./env')
// 合并配置
let config = Object.assign(baseConfig, envConfig[baseConfig.ENV])

// 导出配置
module.exports = config

核心代码封装

恭喜你,看到这里,你已经完成了所有封装的前期准备工作,那么我们开始正式封装。

定义核心请求类HttpRequest

这里我们使用单例模式定义此核心类,好处有三:

  • 单例模式可以确保所有对象都访问唯一实例;
  • 因为类控制了实例化过程,所以类可以灵活更改实例化过程;
  • 因为只有一个实例,所以减少内存开支和系统的性能开销。

虽然我很赞同那句:最好的注释就是没有注释",但是这在工具类里显然不生效,工具类的作用是让使用的人快速完成某项活动,而不是让他惊叹三连。所以该有的注释还是要有的,如果大家对于注释感兴趣的人数足够多,我会开一期如何写注释的文章。

export class HttpRequest {
  private static instance: HttpRequest
  private constructor() {}
   /** 请求函数(单例模式)
   *
   * **注意:**
   * 1. 处理请求的函数记得使用`async/await`
   * 2. `method`需使用`HttpMethod`枚举类,切勿自行定义
   *
   * **示例代码**
   * ```js
    HttpRequest.getInstance().request({
      url: '/Api',
      method: HttpMethod.GET
    })
   * ```
   */
  public static getInstance(): HttpRequest {
    if (!this.instance) {
      this.instance = new HttpRequest()
    }
    return this.instance
  }
}

写到这里,单例模式就完成了,那么现在我们需要实现url的拼接。

处理url

HttpRequest中定义getApiAppName方法。此方法是兼容全路径写法的请求,在实际开发中,可以有一些非环境配置中心的请求需要处理,所以这里做一个兼容处理,同时也拼接好了全路径。

  // 处理url 兼容全路径
  private getApiAppName(url: string | undefined) {
    if (!url) {
      return
    }
    if (typeof url == 'string' && url.indexOf('http') >= 0) {
      return url
    }
    return `${Config.host}${url}`
  }

处理异常

HttpRequest中定义handerErrorStatus方法。此方法是用来处理后端异常状态码。

  // 处理后端异常状态码
  private handerErrorStatus(statusCode: number, requestConfig: RequestConfig) {
    if (statusCode == 502 || statusCode == 503) {
      if (requestConfig.needToken) {
        wx.showToast({
          title: '服务器开小差',
          icon: 'none'
        })
      }
      return true
    }
    return false
  }

定义核心方法request

HttpRequest中引入配置文件。

// 引入配置文件
const Config = require('../config/config')

接下来在HttpRequest中定义核心方法request,这里在处理状态码的时候采用的是if/else写法,如果大家业务里有更多的逻辑可以外面把规则定义成Map,然后内部引用规则,方便理解和阅读。

再次强调,一个好的代码是可以别人看懂而不是只有自己能看到,尤其是工具类方法,更要要降低理解门槛和使用门槛。

  public request(requestConfig: RequestConfig): Promise<SpecResult<MyAwesomeData>> {
    let _this = this
    //url处理
    requestConfig.url = this.getApiAppName(requestConfig.url)
    return new Promise((resolve, reject) => {
      // 默认header
      let header = {
        'content-type': 'application/json'
      }
      wx.request({
        method: requestConfig.method === HttpMethod.GET ? 'GET' : 'POST',
        url: `${requestConfig.url}`,
        data: requestConfig.data,
        header: Object.assign(header, requestConfig?.header),
        success: async function (res: SpecResult<MyAwesomeData>) {
          console.log('发送返回:', res) //res:{cookies, data, header, statusCode}
          if (_this.handerErrorStatus(res.statusCode, requestConfig)) {
            reject('失败了')
          } else {
            // 200状态码请求正常
            if (res.statusCode == 200) {
              if ([401, 402, 403, 405, 407, 408].indexOf(res.data.code) != -1 && requestConfig.needToken) {
                //……
              }
            } else {
              //非200状态码(排除handerErrorStatus特殊处理过的状态码)-数据处理
              res.data = { code: res.statusCode || -404, msg: '服务找不到', data:res.data }
            }
          }
          resolve(res)
        },
        fail: err => reject(err)
      })
    })
  }

恭喜你,到这里,封装已经完美结束了,那么我们一起来看下如何使用吧。

使用

  1. 在需要使用的文件内引入request
import { HttpMethod, HttpRequest } from '/resources/utils/request';
  1. 使用async/await接受返回值。
    const res = await HttpRequest.getInstance().request({
      url: 'serviceProduct/showcase/getShowcase',
      method: HttpMethod.GET
    })
  1. 可以开始业务逻辑啦!

写在最后

小程序这个系列我还会继续更新,敬请期待~

本篇文章到这里就结束了,如果文章对你有用,可以三连支持一下,如果文章中有错误或者说你有更好的见解,欢迎指正~文章来源地址https://www.toymoban.com/news/detail-491455.html

到了这里,关于小程序开发指南-TS封装wx.request的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 微信小程序 wx.request 请求封装

    1、添加一些统一的参数或者配置 2、加上默认的请求头和cookie(有就加,没有就为空) 3、将参数,即传入的url地址、请求头传入请求中 4、封装 post 和 get 请求,使代码使用更加方便,以维护

    2024年02月16日
    浏览(43)
  • 如何入门微信小程序开发,超详细学习指南大全

    2017年微信小程序发布开始,我就开始接触和学习微信小程序,看着小程序不断的更新迭代,功能越来越丰富,生态也越来越健全完善。 在这过程中,开发过商城小程序、停车扫码计费小程序、工具打卡小程序、流量主小程序等等。 很多人问我小程序怎么开发,一个人怎么制

    2024年02月09日
    浏览(55)
  • 微信小程序 基于Promise 对 wx.request 封装处理

    当我们进行微信小程序开发的时候,会经常涉及到发送网络请求来进行后台数据交互,而在微信小程序中,用来 发送请求的方法是 wx.request() , 但是由于 wx.request() 方法 不支持 Promise 风格的调用,所以导致 wx.request() 用来发送异步请求的时候,会触发成 回调地狱 的表现, 以及

    2024年02月04日
    浏览(47)
  • Python桌面程序开发指南

    引言: Python是一种功能强大且易于学习的编程语言,被广泛应用于各个领域。在软件开发中,Python也有着广泛的应用,特别是在桌面程序开发方面。本文将介绍如何使用Python来开发桌面程序,并提供一些实用的技巧和最佳实践。 一、Python桌面程序的概述 Python桌面程序是指使

    2024年01月16日
    浏览(35)
  • Boost程序库完全开发指南:1-开发环境和构建工具

      Boost官方于2019年12月发布的1.72版编写,共包含160余个库/组件,涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域,使用Boost,将大大增强C++的功能和表现力。环境:Windows 10,WSL2,Ubuntu 20.04 LTS,Rider(WSL远程开发),gcc/g++ 9.4.0,

    2024年02月07日
    浏览(46)
  • androidframework开发,写给Android开发的小程序布局指南

    一、关于Handler面试那些问题 1、Handler Looper Message 关系是什么? 2、Messagequeue 的数据结构是什么?为什么要用这个数 据结构? 3、如何在子线程中创建 Handler? 4、Handler post 方法原理? 5、Android 消息机制的原理及源码解析 6、Android Handler 消息机制 7、Android 消息机制 … 二、关于

    2024年03月23日
    浏览(75)
  • 抖音小程序实践三:接口开发指南

    通过官方文档可以更系统的学习到所有的接口,我这边罗列一下我自己用到测试过的接口供大家参考。 前端-小程序对接官方文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info 服务端-小程序官方文档:https://developer.open-douyin.com/docs/re

    2024年02月03日
    浏览(39)
  • CoreDX DDS应用开发指南(5)开发发布应用程序

            创建发布应用程序的步骤如下: 创建或获取应用程序数据的DDL文件。 使用DDL编译器编译DDL文件。类型特定的支持和DataWriter是编译DDL的结果。 编写发布应用程序 编译发布应用程序         启用DDS的应用程序本质上是以数据为中心data-centric的。为了使这些以数

    2024年02月08日
    浏览(42)
  • 情侣积分微信小程序零基础开发教程(附代码及开发指南)

    本文最新版本 在idofSunChonggao 的基础上进行开发, 感谢! 且感谢初版(UxxHans)! ⭐ 如果本仓库对您有所帮助,您的fork或star就是对我最大的鼓励,谢谢! 改了还蛮多的,具体看界面展示吧~ 零前端基础,全凭爱意。代码存在诸多不足和bug,仅供参考。 ⭐ 增加任务类型选择:

    2024年02月09日
    浏览(60)
  • Taro小程序隐私协议开发指南填坑

    一. 配置文件 app.config.js 二. 开发者工具基础库修改 原因: 从基础库 2.32.3 开始支持 修改路径:详情-本地设置-调试基础库 三. 用户隐私保护指引更新 修改路径:mp后台-设置-服务内容声明-用户隐私保护指引 隐私接口: 直达文档 报错: { \\\"errMsg\\\": \\\"A:fail api scope is not declared in

    2024年02月07日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包