您好,登錄后才能下訂單哦!
這篇文章主要介紹了小程序中如何對網絡請求進行二次封裝,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在做微信小程序開發的時候難免會涉及到網絡請求操作,小程序提供的原生網絡請求的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,為什么還需要進行二次封裝呢?
第一點、避免重復代碼
避免重復代碼主要體現在以下幾點:
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
工程結構:
在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') }); } })
感謝你能夠認真閱讀完這篇文章,希望小編分享的“小程序中如何對網絡請求進行二次封裝”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。