微信小程式之網路請求簡單封裝

Code4Android發表於2017-06-27

在微信小程式中實現網路請求相對於Android來說感覺簡單很多,我們只需要使用其提供的API就可以解決網路請求問題。

  • 普通HTTPS請求(wx.request)
  • 上傳檔案(wx.uploadFile)
  • 下載檔案(wx.downloadFile)
  • WebSocket通訊(wx.connectSocket)

為了資料安全,微信小程式網路請求只支援https,當然各個引數的含義就不在細說,不熟悉的話可以;可以去閱讀官方文件的網路請求api,當我們使用request時header的content-typ預設是application/json,在文件中指出method 的value必須是大寫,不過經過測試,小寫也能請求成功。request預設的超時時間是60s,如果我們想自定義超時時間,我們可以在app.json中加入下面程式碼片段,分別設定request,socket,和上傳檔案及下載檔案的超時時間。

  "networkTimeout": {
    "request": 5000,
    "connectSocket": 5000,
    "uploadFile": 5000,
    "downloadFile": 5000
  }複製程式碼

設定過超時時間,我們就開始封裝網路請求,平時我們所接觸的網路請求,一般會分為兩類,一類是在後臺執行的,沒有載入對話方塊提示,另一種就是有提示,如提示正在載入資料,,那麼我們就以此為線索來進行封裝。先建立一個network的網路請求工具類,然後

// 展示進度條的網路請求
// url:網路請求的url
// params:請求引數
// message:進度條的提示資訊
// success:成功的回撥函式
// fail:失敗的回撥
function requestLoading(url, params, message, success, fail) {
  console.log(params)
    wx.showLoading({
      title: message,
    })
  wx.request({
    url: url,
    data: params,
    header: {
      'content-type': 'application/x-www-form-urlencoded'
    },
    method: 'post',
    success: function (res) {
      //console.log(res.data)
        wx.hideLoading()
      if (res.statusCode == 200) {
        success(res.data)
      } else {
        fail()
      }

    },
    fail: function (res) {
        wx.hideLoading()
        fail()
    },
    complete: function (res) {

    },
  })
}複製程式碼

上面函式很好理解,引數的含義已在程式碼中解釋,在網路請求開始前,先展示Loading對話方塊,提示使用者當前網路正在請求資料,當網路請求成功或者失敗後呼叫wx.hideLoading()取消提示框的展示。在api中還提供了wx.showNavigationBarLoading()用於顯示當前頁面的導航條載入動畫,那麼如果我們想展示這個動畫可以在requestLoading執行開始呼叫wx.showNavigationBarLoading(),然後在網路請求成功或者失敗後呼叫wx.hideNavigationBarLoading()隱藏導航欄載入動畫。

當網路請求成功並且狀態碼為200時,將請求到的資料回撥通過su
ccess(res.data)回撥給我們的方法,在上面我們沒有對失敗原因進行細分,當然你也可以給失敗回撥加個引數,用於提示使用者失敗的原因,如
res.statusCode ==500時提示伺服器內部錯誤,res.statusCode ==-1時提示請檢查網路,res.statusCode ==404,找不到地址等等。
然後我們在建立一個不顯示對話方塊,使用者後臺請求資料的請求函式,為了少寫程式碼,我們共用上面的函式,如下

//不顯示對話方塊的請求
function request(url, params, success, fail) {
  this.requestLoading(url, params, "", success, fail)
}複製程式碼

我們看到我們最終還是呼叫的requestLoading,那麼我們可以在該函式作下判斷,如果提示資訊message==''就不顯示對話方塊。
最終的程式碼

function request(url, params, success, fail) {
  this.requestLoading(url, params, "", success, fail)
}
// 展示進度條的網路請求
// url:網路請求的url
// params:請求引數
// message:進度條的提示資訊
// success:成功的回撥函式
// fail:失敗的回撥
function requestLoading(url, params, message, success, fail) {
  console.log(params)
  wx.showNavigationBarLoading()
  if (message != "") {
    wx.showLoading({
      title: message,
    })
  }
  wx.request({
    url: url,
    data: params,
    header: {
      //'Content-Type': 'application/json'
      'content-type': 'application/x-www-form-urlencoded'
    },
    method: 'post',
    success: function (res) {
      //console.log(res.data)
      wx.hideNavigationBarLoading()
      if (message != "") {
        wx.hideLoading()
      }
      if (res.statusCode == 200) {
        success(res.data)
      } else {
        fail()
      }

    },
    fail: function (res) {
      wx.hideNavigationBarLoading()
      if (message != "") {
        wx.hideLoading()
      }
      fail()
    },
    complete: function (res) {

    },
  })
}
module.exports = {
  request: request,
  requestLoading: requestLoading
}複製程式碼

使用就很簡單了,如下

//路徑根據自己專案路徑修改
var network = require("/utils/network.js")
getData:function(){
    network.requestLoading(URL.MY_SCORE, that.data.params, '正在載入資料', function (res) {
    //res就是我們請求介面返回的資料
      console.log(res)
    }, function () {
      wx.showToast({
        title: '載入資料失敗',
      })
    })
}複製程式碼

相關文章