中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

小程序中如何對網絡請求進行二次封裝

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

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

1、背景

在做微信小程序開發的時候難免會涉及到網絡請求操作,小程序提供的原生網絡請求的api如下所示:

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

其中:

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

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

  • header:設置請求的 header,content-type 默認為 application/json,

  • success: 為請求成功后的回調,res包含請求成功后返回的數據。

更多關于 wx.request的用法可以查看官方介紹。

RequestTask | 微信開放文檔

那既然官方已經提供有api,為什么還需要進行二次封裝呢?

2、二次封裝的原因

第一點、避免重復代碼

避免重復代碼主要體現在以下幾點:

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

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

小程序中如何對網絡請求進行二次封裝小程序中如何對網絡請求進行二次封裝

請求結束的時候,隱藏加載框:

小程序中如何對網絡請求進行二次封裝

第二點、避免回調地獄

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

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
              }
            })
          }
        })
      }
    })
  },

是不是很像俄羅斯套娃。

為了避免這種寫法,當然進行封裝了,在這個地方采用了Promise。

關于Prolise的介紹可以到廖雪峰的官方網站去查看,有詳細的介紹。

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

3、具體的封裝實現

工程結構:

小程序中如何對網絡請求進行二次封裝

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

1) httpUtils.js

網絡請求的封裝,具體代碼如下:

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


/**
 * 網絡請求request
 * obj.data 請求接口需要傳遞的數據
 * obj.showLoading 控制是否顯示加載Loading 默認為false不顯示
 * obj.contentType 默認為 application/json
 * obj.method 請求的方法  默認為GET
 * obj.url 請求的接口路徑 
 * obj.message 加載數據提示語
 */
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('==    接口參數:' + JSON.stringify(data));
          console.log('==    請求類型:' + method);
          console.log("==    接口狀態:" + res.statusCode);
          console.log("==    接口數據:" + JSON.stringify(res.data));
          console.log('===============================================================================================')
          if (res.statusCode == 200) {
            resolve(res);
          } else if (res.statusCode == 401) {//授權失效
            reject("登錄已過期");
            jumpToLogin();//跳轉到登錄頁
          } else {
            //請求失敗
            reject("請求失敗:" + res.statusCode)
          }
        },
        fail: function(err) {
          //服務器連接異常
          console.log('===============================================================================================')
          console.log('==    接口地址:' + url)
          console.log('==    接口參數:' + JSON.stringify(data))
          console.log('==    請求類型:' + method)
          console.log("==    服務器連接異常")
          console.log('===============================================================================================')
          reject("服務器連接異常,請檢查網絡再試");
        },
        complete: function() {
          ui.hideLoading();
        }
      })
    });
  }
  

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

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

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) 具體調用

在index.js 進行了網絡請求,具體代碼如下:

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

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

  onLoad() {
  },

  //獲取接口數據
  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')
    });
  }
})

感謝你能夠認真閱讀完這篇文章,希望小編分享的“小程序中如何對網絡請求進行二次封裝”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上饶县| 麻阳| 罗定市| 广河县| 屏东县| 泾川县| 云林县| 班玛县| 洞口县| 阿鲁科尔沁旗| 宜丰县| 旅游| 宜城市| 隆尧县| 镇平县| 红河县| 襄汾县| 潮州市| 萨迦县| 娄烦县| 安福县| 宁乡县| 津南区| 乌兰浩特市| 孟津县| 扶沟县| 远安县| 南乐县| 海宁市| 卢湾区| 四子王旗| 武川县| 新绛县| 门源| 临江市| 唐山市| 大荔县| 巨野县| 四平市| 南川市| 睢宁县|