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

【uniapp&微信小程序】封裝uni.request()

這篇具有很好參考價(jià)值的文章主要介紹了【uniapp&微信小程序】封裝uni.request()。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【uniapp&微信小程序】封裝uni.request()

前言

? ? ? ? 在項(xiàng)目開發(fā)過程中,往往需要對請求進(jìn)行二次封裝,這篇文章將對uni.request()進(jìn)行二次封裝,并實(shí)現(xiàn)多個環(huán)境的請求配置,對請求方式,數(shù)據(jù)格式等進(jìn)行封裝,將請求做到最簡化。

一.封裝uni.request()

第一步基于uni.request()進(jìn)行二次封裝,集成項(xiàng)目開發(fā)中需要的參數(shù)及方法。

新建src/request/index.ts文件內(nèi)容如下:?

/**
 * 創(chuàng)建request請求
 * @returns
 */
const request = <T = any>(
  url: string, //接口地址
  type: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT', //請求方式
  data: AnyObject, //請求的參數(shù)
  header: any //設(shè)置請求的 header
): Promise<T> => {
  // 拼接url  config.base后面會講到
  let apiUrl = config.base + url
  // 這里是獲取存在Store中的token,獲取方式根據(jù)自身項(xiàng)目來
  const userStore = useUserStore()
  // 全局添加請求頭
  let obj = {
    // 獲取Store中的token || 獲取本地存儲的token
    'Authori-zation': (userStore.token || storage.getData("TOKEN") || ""),
  }
  if (header) {
    // 有無傳入header,有則合并
    let headers = Object.assign(header, obj);
    header = headers;
  } else {
    header = obj
  }
  if (data) {
    // 清除無用參數(shù)
    Object.keys(data).forEach(key => {
      if (data[key] == null || data[key] == undefined || data[key] === '') {
        delete (data[key]);
      }
    })
  }

  return new Promise((resolve, reject) => {
    uni.request({
      url: apiUrl,
      method: type,
      data,
      header,
      success(res) {
        if (res.statusCode == 200) {
          const data: any = res.data;
          if (data.code == 0) {
            // 正常拋出數(shù)據(jù)
            resolve(data.data as T)
          } else {
            if(data.code == 401) {
              // 未登錄
              uni.redirectTo({
                url: ""  //未登錄跳轉(zhuǎn)指定頁面
              })
              uni.hideLoading();
              return reject(data);
            }
            // 錯誤數(shù)據(jù)
            uni.hideLoading();
            // 彈窗錯誤框,這里是自己封裝組件,
            common.toastErr(data.message || "網(wǎng)絡(luò)請求異常") 
            reject(data);
          }
        } else {
          console.log(data)
          uni.hideLoading();
          common.toastErr("網(wǎng)絡(luò)請求異常")
          reject(data)
        }
      },
      fail(err) {
        console.log(err)
        uni.hideLoading();
        common.toastErr("網(wǎng)絡(luò)請求異常")
        reject(err)
      }
    })
  })
}

二.根據(jù)環(huán)境配置請求地址

????????上面我們已經(jīng)對uni.request()進(jìn)行了封裝,前面代碼中提到的config.base就是我們需要獲取的地址,在項(xiàng)目開發(fā)過程中,往往會有多個環(huán)境,如開發(fā)環(huán)境、預(yù)生產(chǎn)環(huán)境、生產(chǎn)環(huán)境等等,那我們怎么根據(jù)不同環(huán)境來配置對應(yīng)的請求地址或其他信息呢?

要做到根據(jù)不同環(huán)境讀取不同配置信息,那我們這里就需要用到uni.getAccountInfoSync()方法,該方法可以獲取當(dāng)前小程序賬號信息,其返回值miniProgram屬性的envVersion值,就是我們想獲取的當(dāng)前小程序環(huán)境:

屬性 類型 說明
envVersion string 小程序當(dāng)前環(huán)境版本:develop開發(fā)板;trial體驗(yàn)版;release正式版

已經(jīng)解決了獲取環(huán)境問題,那我們就可以來配置不同環(huán)境啦,這里分三種環(huán)境:

  • dev 開發(fā)環(huán)境
  • test 測試環(huán)境
  • prod 生產(chǎn)環(huán)境

在src下新建config文件,其下dev,test,prod三個文件夾用來配置對應(yīng)信息。

先對配置進(jìn)行ts規(guī)范,因?yàn)轫?xiàng)目中可能不知請求地址一個配置,可能還有應(yīng)用地圖的key等其他信息,我們可以統(tǒng)一配置,新建config/types.ts? 如下:

export interface IConfig {
  // 接口主地址
  base: string;
  // 環(huán)境模式
  mode: string;
  // 地圖key
  mapKey: string;
  // 密鑰
  secretKey: string;
}

?接下來就是具體內(nèi)容的配置,新建config/dev/index.ts如下:

// dev 開發(fā)環(huán)境
import {IConfig} from "../types";

const test: IConfig = {
  // #ifdef H5
  base: "",
  // #endif

  // #ifdef MP-WEIXIN
  base:'http://192.168.1.15:8090/api',
  // #endif
  // 模式
  mode: "dev",
  // 地圖key
  mapKey: "",
  // Secret Key
  secretKey: ""
}

export default test;

?新建config/test/index.ts如下:

// test 測試環(huán)境
import {IConfig} from "../types";

const test: IConfig = {
  // #ifdef H5
  base: "",
  // #endif

  // #ifdef MP-WEIXIN
  base:'http://192.168.1.15:8090/api',
  // #endif
  // 模式
  mode: "test",
  // 地圖key
  mapKey: "",
  // Secret Key
  secretKey: ""
}

export default test;

??新建config/prod/index.ts如下:

// prod 生產(chǎn)環(huán)境
import {IConfig} from "../types";

const test: IConfig = {
  // #ifdef H5
  base: "",
  // #endif

  // #ifdef MP-WEIXIN
  base:'http://www.baidu.com/api',
  // #endif
  // 模式
  mode: "prod",
  // 地圖key
  mapKey: "",
  // Secret Key
  secretKey: ""
}

export default test;

上面三個文件中使用了#ifdef?#endif 注釋,這是因?yàn)槲覀兊捻?xiàng)目可能不只是在小程序上運(yùn)行,如我開發(fā)過的項(xiàng)目就有一個溯原H5頁面,那這時(shí)候就得區(qū)分不同平臺,這里簡單介紹一下如何區(qū)分:

?#ifdef?#endif其實(shí)就是條件編譯,條件編譯是用特殊注釋作為標(biāo)記,在編譯時(shí)根據(jù)特殊注釋,將注釋里面的代碼編譯到不同平臺,其寫法如下:

已?#ifdef #ifndef ??%PLATFORM%? 開頭 ,中間部分寫代碼,以?#endif?結(jié)尾。

  • #ifdef :if defined 僅在某平臺存在
  • #ifndef:if not defined 除了某平臺均存在
  • %PLATFORM%:平臺名稱,如H5,MP-WEIXIN?

所以上面三個文件中條件編譯的意思就是只在微信小程序存在/只在H5頁面存在。

此時(shí)我們已經(jīng)準(zhǔn)備好了三種環(huán)境下的配置,那么接下來就是對當(dāng)前環(huán)境的判斷及使用,在config下新建index.ts 內(nèi)容如下:?

import { IConfig } from "./types";
import prod from "./prod";
import test from "./test";
import dev from "./dev";

let obj: IConfig;

// #ifdef MP-WEIXIN
const plat = uni.getAccountInfoSync().miniProgram.envVersion
if(plat === "release") {
  obj = prod
} else if(plat === "trial") {
  obj = test
} else {
  obj = dev
}
// #endif

// #ifdef H5
if(import.meta.env.MODE === "production") {
  obj = prod
} else if(import.meta.env.MODE === "test") {
  obj = test
} else {
  obj = dev
}
// #endif
export default obj;

這一文件中就用到了上面講的獲取當(dāng)前環(huán)境的方法,來配置對應(yīng)信息,前面在request/index文件中提到的config.base就是來自于此。

三.封裝請求方式

? ? ? ? 到這個位置其實(shí)我們的封裝已經(jīng)可以使用了,但是在實(shí)際開發(fā)中,還分有g(shù)et,post,put,delete等請求方式,及json,form表單等數(shù)據(jù)格式,那為了后續(xù)開發(fā)的便捷,我們還有繼續(xù)根據(jù)請求方式及數(shù)據(jù)格式封裝請求,這一部分就繼續(xù)寫在request/index.ts 文件中:

/**
 * http get 請求
 * @param url 請求接口
 * @param data 請求參數(shù)
 * @returns
 */
const get = <T = any>(
  url: string,
  data: AnyObject
): Promise<T> => {
  return request(url, 'GET', data, {})
}

/**
 * http post json請求
 * @param url 請求接口
 * @param data 請求參數(shù)
 * @returns
 */
const postJ = <T = any>(
  url: string,
  data: AnyObject
): Promise<T> => {
  return request(url, 'POST', data, {
    'Content-Type': 'application/json'
  })
}

/**
 * http post form表單請求
 * @param url 請求接口
 * @param data 請求參數(shù)
 * @returns
 */
const postW = <T = any>(
  url: string,
  data: AnyObject
): Promise<T> => {
  return request(url, 'POST', data, {
    'Content-Type': 'application/x-www-form-urlencoded'
  })
}

/**
 * http put json請求
 * @param url 請求接口
 * @param data 請求參數(shù)
 * @returns
 */
const putJ = <T = any>(url: string, data: AnyObject): Promise<T> => {
  return request(url, 'PUT', data, {
    'Content-Type': 'application/json'
  })
}

/**
 * http put form表單請求
 * @param url 請求接口
 * @param data 請求參數(shù)
 * @returns
 */
const putW = <T = any>(url: string, data: AnyObject): Promise<T> => {
  return request(url, 'PUT', data, {
    'Content-Type': 'application/x-www-form-urlencoded'
  })
}
/**
 * http delete請求
 * @param url 請求接口
 * @param data 請求參數(shù)
 * @returns
 */
const del = <T = any>(url: string, data: AnyObject): Promise<T> => {
  return request(url, 'DELETE', data, {})
}


export default {
  get,
  postJ,
  postW,
  putJ,
  putW,
  del
}

四.調(diào)用請求

接下來我們就根據(jù)上面封裝的請求來試一試效果吧,新建src/apis文件:

//引入封裝方法
import http from "@/request";

export const getTest = () => http.get<any>(`url`, {})

export const postTest = (data:any) => http.postJ<any>(`url`, data)

總結(jié)?

? ? ? ? 可以看到,封裝之后的請求已經(jīng)非常精簡,配置好各個環(huán)境地址,根據(jù)請求方式,數(shù)據(jù)格式,選擇對應(yīng)的封裝方法即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-487199.html

到了這里,關(guān)于【uniapp&微信小程序】封裝uni.request()的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 微信小程序 封裝request請求

    創(chuàng)建 utils 文件夾后創(chuàng)建 api 文件夾創(chuàng)建 request.js 創(chuàng)建 index.js

    2024年02月15日
    瀏覽(20)
  • 微信小程序封裝wx.request請求

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

    對微信小程序的印象我還停留在2年前剛?cè)胄械臅r(shí)候,那是還不懂什么是Promise,只知道小程序發(fā)請求有時(shí)候要在success回調(diào)中嵌套好多層(后來我才知道這叫 回調(diào)地獄 )。最近剛好有個小程序的項(xiàng)目交給我發(fā)開發(fā),加上如今的我自認(rèn)為對Promise掌握的還可以,所以這次也嘗試著封

    2024年02月16日
    瀏覽(19)
  • 微信小程序 wx.request 請求封裝

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

    2024年02月16日
    瀏覽(22)
  • 微信小程序---封裝uni.$showMsg()方法

    當(dāng)數(shù)請求失敗之后,經(jīng)常需要調(diào)用 uni.showToast(( /* 配置對象/ 方法來提示用戶時(shí),可以在全局封裝一個 uni.showMsg()方法,來簡化 uni.showToast() 方法的調(diào)用。具體的改造步驟如下: 1.在main.js中,為uni對象掛載自定義的$showMsg()方法: 2.在需要提示消息的時(shí)候,直接調(diào)用uni.$showMsg()方法

    2024年01月16日
    瀏覽(20)
  • UniApp項(xiàng)目中 使用微信小程序原生語言 進(jìn)行開發(fā)

    UniApp項(xiàng)目中 使用微信小程序原生語言 進(jìn)行開發(fā)

    wxcomponents 下放的是微信小程序原生代碼寫的組件。我進(jìn)行了封裝 在你下uniApp 項(xiàng)目的根目錄創(chuàng)建一個 wxcomponents 名字千萬不要錯 京東、支付寶燈參考下面圖片 官方文檔也有介紹 然后在你需要引入原生功能的頁面里面引入你的組件(我這里提前已經(jīng)放過來了。在上面圖可看到

    2024年02月04日
    瀏覽(100)
  • HbuilderX運(yùn)行uniapp項(xiàng)目到微信小程序時(shí),自動打開了微信小程序開發(fā)工具但是進(jìn)不去項(xiàng)目

    HbuilderX運(yùn)行uniapp項(xiàng)目到微信小程序時(shí),自動打開了微信小程序開發(fā)工具但是進(jìn)不去項(xiàng)目

    這樣選擇之后,運(yùn)行時(shí)一直停在打開微信開發(fā)者工具不能進(jìn)入項(xiàng)目,如圖: 這是因?yàn)槟惝?dāng)前不是這個微信小程序的開發(fā)者,聯(lián)系管理員添加你為當(dāng)前小程序的開發(fā)者就行了。 或者是更換appid

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

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

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

    2024年02月04日
    瀏覽(31)
  • 微信小程序開發(fā)者工具運(yùn)行 uni-app 項(xiàng)目時(shí)報(bào)錯 Uncaught (in promise) undefined

    微信小程序開發(fā)者工具運(yùn)行 uni-app 項(xiàng)目時(shí)報(bào)錯 Uncaught (in promise) undefined

    開發(fā)者工具控制臺報(bào)錯 Uncaught (in promise) undefined,如圖: 該錯誤主要是因?yàn)檎{(diào)試基礎(chǔ)庫過高或過低導(dǎo)致的。 在 微信開發(fā)者工具 — 詳情 — 本地設(shè)置 — 調(diào)試基礎(chǔ)庫 中,將調(diào)試基礎(chǔ)庫版本調(diào)低或調(diào)高即可 調(diào)試基礎(chǔ)庫:此處選擇的基礎(chǔ)庫為微信中的基礎(chǔ)庫版本,且僅用于開發(fā)者

    2024年02月12日
    瀏覽(40)
  • WebStorm開發(fā)uni-app ,用vue2實(shí)現(xiàn)手機(jī)APP(apk) + 微信小程序多端項(xiàng)目開發(fā)方案

    WebStorm開發(fā)uni-app ,用vue2實(shí)現(xiàn)手機(jī)APP(apk) + 微信小程序多端項(xiàng)目開發(fā)方案

    我們主要分析了如下小程序開發(fā)框架,主要包括: 框架 技術(shù)棧 案例 微信小程序 支付寶小程序 百度小程序 頭條小程序 H5 App uni-app Vue 豐富 ? ?? ?? ? ?? ? Taro React 豐富 ? ? ? ? ? ? wepy Vue 豐富 ? ? ? ? ? ? mpvue Vue 豐富 ? ? ? ? ?? ? ?首先,就要排

    2024年02月08日
    瀏覽(44)
  • Vue3+TS版本Uniapp:封裝uni.request請求配置

    Vue3+TS版本Uniapp:封裝uni.request請求配置

    作者: 前端小王hs 阿里云社區(qū)博客專家/清華大學(xué)出版社簽約作者?/CSDN百萬訪問博主/B站千粉前端up主 uniapp 的封裝邏輯不同于 Vue3 項(xiàng)目中直接使用 axios.create() 方法創(chuàng)建實(shí)例(在 create 方法中寫入請求的地址、請求頭、超時(shí)等內(nèi)容),代碼如下: PS:上述代碼來自博主在B站的

    2024年04月22日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包