您好,登錄后才能下訂單哦!
這篇文章主要介紹了小程序中如何對網(wǎng)絡(luò)請求進(jìn)行二次封裝,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在做微信小程序開發(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)行二次封裝呢?
第一點(diǎn)、避免重復(fù)代碼
避免重復(fù)代碼主要體現(xiàn)在以下幾點(diǎn):
1) 我們公司調(diào)用后臺接口,除了登錄接口外,其它的接口請求都需要在請求頭中加入token,如果不做封裝的情況下,每次調(diào)用網(wǎng)絡(luò)請求都需要傳token,很麻煩。
2)在網(wǎng)絡(luò)請求的時候往往需要給個加載框,提示用戶正在加載.... 如下圖所示:
請求結(jié)束的時候,隱藏加載框:
第二點(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
工程結(jié)構(gòu):
在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í)!
免責(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)容。