在微信小程序中實現網絡請求相對於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: '加載數據失敗',
})
})
}