溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝

發(fā)布時間:2021-11-02 11:34:25 來源:億速云 閱讀:225 作者:小新 欄目:移動開發(fā)

這篇文章主要介紹了小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1、背景

在做微信小程序開發(fā)的時候難免會涉及到網(wǎng)絡(luò)請求操作,小程序提供的原生網(wǎng)絡(luò)請求的api如下所示:

wx.request({
  url: 'https://test.com/******', //僅為示例,并非真實(shí)的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默認(rèn)值
  },
  success (res) {
    console.log(res.data)
  }
})

其中:

  • url: 為請求的后臺接口地址;

  • data: 為請求接口需要攜帶的參數(shù);

  • header:設(shè)置請求的 header,content-type 默認(rèn)為 application/json,

  • success: 為請求成功后的回調(diào),res包含請求成功后返回的數(shù)據(jù)。

更多關(guān)于 wx.request的用法可以查看官方介紹。

RequestTask | 微信開放文檔

那既然官方已經(jīng)提供有api,為什么還需要進(jìn)行二次封裝呢?

2、二次封裝的原因

第一點(diǎn)、避免重復(fù)代碼

避免重復(fù)代碼主要體現(xiàn)在以下幾點(diǎn):

1) 我們公司調(diào)用后臺接口,除了登錄接口外,其它的接口請求都需要在請求頭中加入token,如果不做封裝的情況下,每次調(diào)用網(wǎng)絡(luò)請求都需要傳token,很麻煩。

2)在網(wǎng)絡(luò)請求的時候往往需要給個加載框,提示用戶正在加載.... 如下圖所示:

小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝

請求結(jié)束的時候,隱藏加載框:

小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝

第二點(diǎn)、避免回調(diào)地獄

一個頁面如果有多個網(wǎng)絡(luò)請求,并且請求有一定的順序,wx.request 是異步操作,那么最直接的結(jié)果就如下所示代碼:

onLoad: function () {
    wx.request({
      url: 'https://test.com/api/test01',
      success:res=>{
        wx.request({
          url: 'https://test.com/api/test02',
          success: res=>{
            wx.request({
              url: 'https://test.com/api/test03',
              success: res=>{
                testDataList: res.content
              }
            })
          }
        })
      }
    })
  },

是不是很像俄羅斯套娃。

為了避免這種寫法,當(dāng)然進(jìn)行封裝了,在這個地方采用了Promise。

關(guān)于Prolise的介紹可以到廖雪峰的官方網(wǎng)站去查看,有詳細(xì)的介紹。

https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

3、具體的封裝實(shí)現(xiàn)

工程結(jié)構(gòu):

小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝

在utils文件夾下新建了兩個文件。

1) httpUtils.js

網(wǎng)絡(luò)請求的封裝,具體代碼如下:

const ui = require('./ui');
const BASE_URL = 'https://www.wanandroid.com'


/**
 * 網(wǎng)絡(luò)請求request
 * obj.data 請求接口需要傳遞的數(shù)據(jù)
 * obj.showLoading 控制是否顯示加載Loading 默認(rèn)為false不顯示
 * obj.contentType 默認(rèn)為 application/json
 * obj.method 請求的方法  默認(rèn)為GET
 * obj.url 請求的接口路徑 
 * obj.message 加載數(shù)據(jù)提示語
 */
function request(obj) {
    return new Promise(function(resolve, reject) {
      if(obj.showLoading){
        ui.showLoading(obj.message? obj.message : '加載中...');
      }
      var data = {};
      if(obj.data) {
        data = obj.data;
      }
      var contentType = 'application/json';
      if(obj.contentType){
        contentType = obj.contentType;
      } 
  
      var method = 'GET';
      if(obj.method){
        method = obj.method;
      }
  
      wx.request({
        url: BASE_URL + obj.url,
        data: data,
        method: method,
        //添加請求頭
        header: {
          'Content-Type': contentType ,
          'token': wx.getStorageSync('token') //獲取保存的token
        },
        //請求成功
        success: function(res) {
          console.log('===============================================================================================')
          console.log('==    接口地址:' + obj.url);
          console.log('==    接口參數(shù):' + JSON.stringify(data));
          console.log('==    請求類型:' + method);
          console.log("==    接口狀態(tài):" + res.statusCode);
          console.log("==    接口數(shù)據(jù):" + JSON.stringify(res.data));
          console.log('===============================================================================================')
          if (res.statusCode == 200) {
            resolve(res);
          } else if (res.statusCode == 401) {//授權(quán)失效
            reject("登錄已過期");
            jumpToLogin();//跳轉(zhuǎn)到登錄頁
          } else {
            //請求失敗
            reject("請求失?。?quot; + res.statusCode)
          }
        },
        fail: function(err) {
          //服務(wù)器連接異常
          console.log('===============================================================================================')
          console.log('==    接口地址:' + url)
          console.log('==    接口參數(shù):' + JSON.stringify(data))
          console.log('==    請求類型:' + method)
          console.log("==    服務(wù)器連接異常")
          console.log('===============================================================================================')
          reject("服務(wù)器連接異常,請檢查網(wǎng)絡(luò)再試");
        },
        complete: function() {
          ui.hideLoading();
        }
      })
    });
  }
  

  //跳轉(zhuǎn)到登錄頁
  function jumpToLogin(){
    wx.reLaunch({
      url: '/pages/login/login',
    })
  }
  
  module.exports = {
    request,
  }

代碼中有詳細(xì)的注釋,在這里就不多做解釋了。

2) ui.js

主要是對wx UI操作的一些簡單封裝,代碼如下:

export const showToast = function(content,duration) {
    if(!duration) duration = 2000
    wx.showToast({
        title: content,
        icon: 'none',
        duration: duration,
    })
  }
  
  var isShowLoading = false
  export const showLoading = function(title) {
    if(isShowLoading) return
    wx.showLoading({
        title: title?title:'',
        mask:true,
        success:()=>{
            isShowLoading = true
        }
    })
  }
  
  export const hideLoading = function() {
    if(!isShowLoading) return
    isShowLoading = false
    wx.hideLoading()
  }

3) 具體調(diào)用

在index.js 進(jìn)行了網(wǎng)絡(luò)請求,具體代碼如下:

// index.js
const httpUtils = require('../../utils/httpUtils')
const ui = require('../../utils/ui')

Page({
  data: {
    str:null,
  },

  onLoad() {
  },

  //獲取接口數(shù)據(jù)
  getNetInfo(){
    let obj = {
      method: "POST",
      showLoading: true,
      url:`/user/register?username=pppooo11&password=pppooo&repassword=pppooo`,
      message:"正在注冊..."
    }
    httpUtils.request(obj).then(res=>{
      this.setData({
        str:JSON.stringify(res)
      })
      ui.showToast(res.data.errorMsg)
    }).catch(err=>{
      console.log('ERROR')
    });
  }
})

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI