国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

小程序開發(fā)指南-TS封裝wx.request

這篇具有很好參考價值的文章主要介紹了小程序開發(fā)指南-TS封裝wx.request。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

小程序開發(fā)指南-TS封裝wx.request

大家好,我是Aliom252181,一個佛系且資質(zhì)平平的前端coder,今天分享下我是如何使用Typescript封裝wx.request的。

寫在前面

本篇文章適合有封裝TS版本小程序請求需求的coder,通過本篇閱讀,你將會了解到:

  • TS代碼提示;
  • 單例模式;
  • 每個接口都可以靈活配置請求頭、超時時間等;
  • 取消原生嵌套地獄寫法,更符合閱讀邏輯。

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

wx.request({
      url: 'http://host/api/key', //請求的接口地址
      method:"get",               //http請求數(shù)據(jù)的方式
      data:{name:'',age:''},      //請求的參數(shù),如name和id
      //請求頭設(shè)置,根據(jù)需要自己設(shè)置
      header:{
        'content-type':"application/json"
      },
      //請求成功時的回調(diào)函數(shù)
      success(res){
        console.log(res);
      },
      //請求失敗的回調(diào)函數(shù)
      fail(msg){
          console.log(msg);
      }
    })

如果不封裝的話,每次使用請求都會造成大段重復(fù)代碼占用代碼區(qū),對閱讀極其不利,也降低了開發(fā)效率,為了解決這個問題,一起來開啟封裝之旅吧。

基礎(chǔ)類型封裝

首先我們要先定義一些我們需要的類型,例如請求參數(shù)類型,返回數(shù)據(jù)類型,還有一些枚舉類型,現(xiàn)在開始封裝:

封裝HTTP請求配置

// HTTP請求方法枚舉
export enum HttpMethod {
  GET,
  POST
}

// HTTP請求配置
interface RequestConfig {
  /** API路徑 */
  url?: string
  /** Method類型 */
  method?: HttpMethod
  /** 接口返回數(shù)據(jù) */
  data?: any
  /** 無TOKEN觸發(fā)異常捕獲時,是否執(zhí)行異常邏輯 */
  needToken?: boolean
  /** Header頭部 */
  header?: object
}

其中needToken是我們的業(yè)務(wù)邏輯,此參數(shù)主要作用于一些需要權(quán)限接口,如果我們不想讓他在request層級觸發(fā)我們的邏輯,例如不想觸發(fā)登錄驗證,就可以在接下來處理返回code時使用。

封裝請求返回數(shù)據(jù)類型

// 繼承中間類型,data聲明為any
interface AnyResult extends WechatMiniprogram.RequestSuccessCallbackResult {
  data: any
}
// 從中間類型繼承一個泛型接口,data聲明為泛型
interface SpecResult<T> extends AnyResult {
  data: T
}
// 聲明業(yè)務(wù)數(shù)據(jù)類型
export interface MyAwesomeData {
  code: number
  msg: string
  data: any
}

這一步是定義返回參的類型,我們希望最終的返回結(jié)果為{code,msg,data},便于我們的使用。其中注意WechatMiniprogram是微信提供的類型,需要大家在TS小程序項目內(nèi)使用,也可以使用NPM包miniprogram-api-typings來作為校驗,如果是后者,要注意在tsconfig.jsontypeRoots字段內(nèi)設(shè)置此包地址,例如:

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

環(huán)境配置

除了正式環(huán)境,大家的日常開發(fā)中免不了要進行多環(huán)境切換,這里寫成配置,方便開發(fā)使用。

首先新建env.ts文件作為環(huán)境配置中心,這里我已常用的三環(huán)境為例,大家自行擴展。

// 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文件作為小程序配置中心,用來控制環(huán)境切換和其他配置。

// config.ts

// 基礎(chǔ)共同的配置
let baseConfig = {
  // 小程序appid
  appid: '……',
  // 環(huán)境
  ENV:'dev'
}

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

// 導(dǎo)出配置
module.exports = config

核心代碼封裝

恭喜你,看到這里,你已經(jīng)完成了所有封裝的前期準備工作,那么我們開始正式封裝。

定義核心請求類HttpRequest

這里我們使用單例模式定義此核心類,好處有三:

  • 單例模式可以確保所有對象都訪問唯一實例;
  • 因為類控制了實例化過程,所以類可以靈活更改實例化過程;
  • 因為只有一個實例,所以減少內(nèi)存開支和系統(tǒng)的性能開銷。

雖然我很贊同那句:最好的注釋就是沒有注釋",但是這在工具類里顯然不生效,工具類的作用是讓使用的人快速完成某項活動,而不是讓他驚嘆三連。所以該有的注釋還是要有的,如果大家對于注釋感興趣的人數(shù)足夠多,我會開一期如何寫注釋的文章。

export class HttpRequest {
  private static instance: HttpRequest
  private constructor() {}
   /** 請求函數(shù)(單例模式)
   *
   * **注意:**
   * 1. 處理請求的函數(shù)記得使用`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
  }
}

寫到這里,單例模式就完成了,那么現(xiàn)在我們需要實現(xiàn)url的拼接。

處理url

HttpRequest中定義getApiAppName方法。此方法是兼容全路徑寫法的請求,在實際開發(fā)中,可以有一些非環(huán)境配置中心的請求需要處理,所以這里做一個兼容處理,同時也拼接好了全路徑。

  // 處理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方法。此方法是用來處理后端異常狀態(tài)碼。

  // 處理后端異常狀態(tài)碼
  private handerErrorStatus(statusCode: number, requestConfig: RequestConfig) {
    if (statusCode == 502 || statusCode == 503) {
      if (requestConfig.needToken) {
        wx.showToast({
          title: '服務(wù)器開小差',
          icon: 'none'
        })
      }
      return true
    }
    return false
  }

定義核心方法request

HttpRequest中引入配置文件。

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

接下來在HttpRequest中定義核心方法request,這里在處理狀態(tài)碼的時候采用的是if/else寫法,如果大家業(yè)務(wù)里有更多的邏輯可以外面把規(guī)則定義成Map,然后內(nèi)部引用規(guī)則,方便理解和閱讀。

再次強調(diào),一個好的代碼是可以別人看懂而不是只有自己能看到,尤其是工具類方法,更要要降低理解門檻和使用門檻。

  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('發(fā)送返回:', res) //res:{cookies, data, header, statusCode}
          if (_this.handerErrorStatus(res.statusCode, requestConfig)) {
            reject('失敗了')
          } else {
            // 200狀態(tài)碼請求正常
            if (res.statusCode == 200) {
              if ([401, 402, 403, 405, 407, 408].indexOf(res.data.code) != -1 && requestConfig.needToken) {
                //……
              }
            } else {
              //非200狀態(tài)碼(排除handerErrorStatus特殊處理過的狀態(tài)碼)-數(shù)據(jù)處理
              res.data = { code: res.statusCode || -404, msg: '服務(wù)找不到', data:res.data }
            }
          }
          resolve(res)
        },
        fail: err => reject(err)
      })
    })
  }

恭喜你,到這里,封裝已經(jīng)完美結(jié)束了,那么我們一起來看下如何使用吧。

使用

  1. 在需要使用的文件內(nèi)引入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. 可以開始業(yè)務(wù)邏輯啦!

寫在最后

小程序這個系列我還會繼續(xù)更新,敬請期待~

本篇文章到這里就結(jié)束了,如果文章對你有用,可以三連支持一下,如果文章中有錯誤或者說你有更好的見解,歡迎指正~文章來源地址http://www.zghlxwxcb.cn/news/detail-491455.html

到了這里,關(guān)于小程序開發(fā)指南-TS封裝wx.request的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 微信小程序 wx.request 請求封裝

    1、添加一些統(tǒng)一的參數(shù)或者配置 2、加上默認的請求頭和cookie(有就加,沒有就為空) 3、將參數(shù),即傳入的url地址、請求頭傳入請求中 4、封裝 post 和 get 請求,使代碼使用更加方便,以維護

    2024年02月16日
    瀏覽(22)
  • 如何入門微信小程序開發(fā),超詳細學(xué)習指南大全

    2017年微信小程序發(fā)布開始,我就開始接觸和學(xué)習微信小程序,看著小程序不斷的更新迭代,功能越來越豐富,生態(tài)也越來越健全完善。 在這過程中,開發(fā)過商城小程序、停車掃碼計費小程序、工具打卡小程序、流量主小程序等等。 很多人問我小程序怎么開發(fā),一個人怎么制

    2024年02月09日
    瀏覽(17)
  • 微信小程序 基于Promise 對 wx.request 封裝處理

    微信小程序 基于Promise 對 wx.request 封裝處理

    當我們進行微信小程序開發(fā)的時候,會經(jīng)常涉及到發(fā)送網(wǎng)絡(luò)請求來進行后臺數(shù)據(jù)交互,而在微信小程序中,用來 發(fā)送請求的方法是 wx.request() , 但是由于 wx.request() 方法 不支持 Promise 風格的調(diào)用,所以導(dǎo)致 wx.request() 用來發(fā)送異步請求的時候,會觸發(fā)成 回調(diào)地獄 的表現(xiàn), 以及

    2024年02月04日
    瀏覽(31)
  • Python桌面程序開發(fā)指南

    引言: Python是一種功能強大且易于學(xué)習的編程語言,被廣泛應(yīng)用于各個領(lǐng)域。在軟件開發(fā)中,Python也有著廣泛的應(yīng)用,特別是在桌面程序開發(fā)方面。本文將介紹如何使用Python來開發(fā)桌面程序,并提供一些實用的技巧和最佳實踐。 一、Python桌面程序的概述 Python桌面程序是指使

    2024年01月16日
    瀏覽(26)
  • Boost程序庫完全開發(fā)指南:1-開發(fā)環(huán)境和構(gòu)建工具

    Boost程序庫完全開發(fā)指南:1-開發(fā)環(huán)境和構(gòu)建工具

    ??Boost官方于2019年12月發(fā)布的1.72版編寫,共包含160余個庫/組件,涵蓋字符串與文本處理、容器、迭代器、算法、圖像處理、模板元編程、并發(fā)編程等多個領(lǐng)域,使用Boost,將大大增強C++的功能和表現(xiàn)力。環(huán)境:Windows 10,WSL2,Ubuntu 20.04 LTS,Rider(WSL遠程開發(fā)),gcc/g++ 9.4.0,

    2024年02月07日
    瀏覽(21)
  • androidframework開發(fā),寫給Android開發(fā)的小程序布局指南

    androidframework開發(fā),寫給Android開發(fā)的小程序布局指南

    一、關(guān)于Handler面試那些問題 1、Handler Looper Message 關(guān)系是什么? 2、Messagequeue 的數(shù)據(jù)結(jié)構(gòu)是什么?為什么要用這個數(shù) 據(jù)結(jié)構(gòu)? 3、如何在子線程中創(chuàng)建 Handler? 4、Handler post 方法原理? 5、Android 消息機制的原理及源碼解析 6、Android Handler 消息機制 7、Android 消息機制 … 二、關(guān)于

    2024年03月23日
    瀏覽(33)
  • 抖音小程序?qū)嵺`三:接口開發(fā)指南

    抖音小程序?qū)嵺`三:接口開發(fā)指南

    通過官方文檔可以更系統(tǒng)的學(xué)習到所有的接口,我這邊羅列一下我自己用到測試過的接口供大家參考。 前端-小程序?qū)庸俜轿臋n:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info 服務(wù)端-小程序官方文檔:https://developer.open-douyin.com/docs/re

    2024年02月03日
    瀏覽(20)
  • CoreDX DDS應(yīng)用開發(fā)指南(5)開發(fā)發(fā)布應(yīng)用程序

    ????????創(chuàng)建發(fā)布應(yīng)用程序的步驟如下: 創(chuàng)建或獲取應(yīng)用程序數(shù)據(jù)的DDL文件。 使用DDL編譯器編譯DDL文件。類型特定的支持和DataWriter是編譯DDL的結(jié)果。 編寫發(fā)布應(yīng)用程序 編譯發(fā)布應(yīng)用程序 ????????啟用DDS的應(yīng)用程序本質(zhì)上是以數(shù)據(jù)為中心data-centric的。為了使這些以數(shù)

    2024年02月08日
    瀏覽(21)
  • 情侶積分微信小程序零基礎(chǔ)開發(fā)教程(附代碼及開發(fā)指南)

    情侶積分微信小程序零基礎(chǔ)開發(fā)教程(附代碼及開發(fā)指南)

    本文最新版本 在idofSunChonggao 的基礎(chǔ)上進行開發(fā), 感謝! 且感謝初版(UxxHans)! ? 如果本倉庫對您有所幫助,您的fork或star就是對我最大的鼓勵,謝謝! 改了還蠻多的,具體看界面展示吧~ 零前端基礎(chǔ),全憑愛意。代碼存在諸多不足和bug,僅供參考。 ? 增加任務(wù)類型選擇:

    2024年02月09日
    瀏覽(21)
  • Taro小程序隱私協(xié)議開發(fā)指南填坑

    Taro小程序隱私協(xié)議開發(fā)指南填坑

    一. 配置文件 app.config.js 二. 開發(fā)者工具基礎(chǔ)庫修改 原因: 從基礎(chǔ)庫 2.32.3 開始支持 修改路徑:詳情-本地設(shè)置-調(diào)試基礎(chǔ)庫 三. 用戶隱私保護指引更新 修改路徑:mp后臺-設(shè)置-服務(wù)內(nèi)容聲明-用戶隱私保護指引 隱私接口: 直達文檔 報錯: { \\\"errMsg\\\": \\\"A:fail api scope is not declared in

    2024年02月07日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包